|
Вопрос # 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 тормозит выполнение запроса (дополнительные затраты на выполнение группировки). Поэтому делать группировку там, где она не нужна - не очень хорошо.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|