| 
| 
 | Вопрос # 2 999/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Работаю с MS Access через ADO в Delphi 7 База содержит две таблицы: Регионы - regions: id, name_reg  Объекты - objects: id, name_reg, name_obj. Таблицы связаны по полю name_reg.
 Как сделать так чтобы в главной таблице (regions) отображались только те записи которым соответсвуют записи во второй (objects).
 
|  |   Вопрос задал: Александр-вц (статус: Посетитель)Вопрос отправлен: 15 июля 2009, 01:22
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Егор Здравствуйте, Александр-вц!Тогда вам проще всего воспользоваться компонентом TADOQuery - в его свойство SQL прописываете запрос:
 
 SELECT name_reg
 FROM regions, objects
 WHERE regions.name_reg=objects.name_reg
 GROUP BY name_reg;
 
 Это если у вас таблицы всё ещё связаны по полю name_reg.
 Правильнее было бы во второй таблице (objects) сделать структуру вида  id, id_reg, name_obj. И тогда запрос должен был бы выглядеть так:
 
 SELECT name_reg
 FROM regions, objects
 WHERE regions.id=objects.id_reg
 GROUP BY name_reg;
 
 Если что непонятно и будут вопросы - задавайте.
 
|  | Ответ отправил: Егор (статус: 10-ый класс)Время отправки: 15 июля 2009, 20:11
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо! |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 16 июля 2009, 05:57; участников в обсуждении: 4. 
|   | Егор (статус: 10-ый класс), 15 июля 2009, 09:26 [#1]:Первое - обычно таблицы связывают не по строковым полям (в вашем случае name) - это дурной тон, а по числовым, а конкретнее - по id. 
 Второе - поясните, как вообще должен отображаться вывод? Ну, т.е. напишите, кратко, часть каждой из таблиц и что вы хотите получить - одну таблицу, две (в одной выбираем строчку, во второй автоматически остаются только соответствующие записи и т.п.) или ещё как?
 
 Думаю, что в вашем случае нужно будет пользоваться компонентом TADOQuery, но, может быть будет работать и TADOTable.
 Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | Александр-вц (статус: Посетитель), 15 июля 2009, 19:44 [#3]:В первой таблице строки: - Ярославская область - Московская область
 - Мурманская область.
 Во второй таблице название АЗС(заправки).
 Не в каждой области они есть.
 Необходимо чтобы в первой таблице показывались только области в которых эти заправки есть. Если в области нет АЗС то и выводить эту строку в главной таблице не нужно.
 |  
|   | Мережников Андрей (статус: Абитуриент), 15 июля 2009, 20:33 [#4]:to Егор - для чего используете в запросе Group by ??? Если хотите отсортировать по алфавиту, тогда надо order by. Если хотите исключить повторяющиеся значения, то надо использовать ключевое слово distinct
 |  
|   | Егор (статус: 10-ый класс), 15 июля 2009, 20:43 [#5]:GROUP BY не для сортировки, а для группировки. Если в Ярославской области будут 10 заправок, то зачем выводить 10 раз "Ярославская область"? Если же нужна сортировка - то, да, нужна ещё и секция ORDER BY.
 Запрос делает то, что было сказано в задании - выводит список регионов. И только. Если нужно выводить ещё и заправки - ну, тут немного надо запрос подправить
  ---------
 добавлено:
 Мда, не посмотрел, действительно, можно было бы и distinct, согласен.
  Просто не привык к нему, всё группировкой делаю   Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | Мережников Андрей (статус: Абитуриент), 16 июля 2009, 05:57 [#6]:если бы надо было выводить названия заправок, то запрос с group by - выдаст ошибку. в списке выводимых значений в этом случае могут быть либо поля, определяющие группировку, либо агрегатные функции. К тому же group by тормозит выполнение запроса (дополнительные затраты на выполнение группировки). Поэтому делать группировку там, где она не нужна - не очень хорошо. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |