Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 249

/ вопрос открыт /

Здравствуйте!
Есть две таблицы. Как их связать, используются ADOQuery?

Александр-вц Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Александр-вц (статус: Посетитель)
Вопрос отправлен: 3 октября 2009, 20:18
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Егор

Здравствуйте, Александр-вц!
В свойство SQL компонента прописываем запрос (см. приложение).
Можно убрать некоторые поля.

Приложение:
  1.  
  2.  
  3. SELECT
  4. objects.id, objects.id_reg, objects.name_objects, regions.id, regions.name_reg
  5. FROM
  6. regions INNER JOIN objects ON regions.id = objects.id_reg;


Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 3 октября 2009, 20:42
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 18; последнее сообщение — 9 октября 2009, 14:51; участников в обсуждении: 2.
Егор

Егор (статус: 10-ый класс), 3 октября 2009, 20:27 [#1]:

а в чём проблема?
хотя бы структуру таблиц опишите

а то на такой общий вопрос можно дать не менее общий ответ:
используйте свойство SQL, в котором и пропишите нужный запрос
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Александр-вц

Александр-вц (статус: Посетитель), 3 октября 2009, 20:31 [#2]:

1 таблица regions(id, name_reg), 2 таблица objects(id, id_reg, name_objects). В первой название региона(Московская область), во второй название объектов.
Егор

Егор (статус: 10-ый класс), 3 октября 2009, 20:43 [#3]:

блин, строчку "regions(id, name_reg), 2 таблица objects(id, id_reg, name_objects)" внёс по ошибке :) её не надо
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Александр-вц

Александр-вц (статус: Посетитель), 3 октября 2009, 20:47 [#4]:

Спасибо.
А, как сделать чтобы в первой таблице оставались только записи имеющие соответсвующие записи во второй.
Егор

Егор (статус: 10-ый класс), 3 октября 2009, 20:47 [#5]:

если нужно в запросе выдавать также объекты, которым не назначены регионы, то нужно использовать не INNER JOIN, а в данном случае RIGHT JOIN:
  regions RIGHT JOIN objects ON regions.id = objects.id_reg;
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 3 октября 2009, 20:49 [#6]:

эээ... не понял, что значит "чтобы в первой таблице оставались только записи имеющие соответсвующие записи во второй"?
записи из первой таблицы удалить надо?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Александр-вц

Александр-вц (статус: Посетитель), 3 октября 2009, 21:00 [#7]:

Нет удалять не надо!
Александр-вц

Александр-вц (статус: Посетитель), 3 октября 2009, 21:03 [#8]:

Надо чтобы в первой остались записи "регионы" у которых есть записи "объекты" во второй!
Егор

Егор (статус: 10-ый класс), 3 октября 2009, 21:11 [#9]:

тогда используй INNER JOIN
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Александр-вц

Александр-вц (статус: Посетитель), 4 октября 2009, 11:43 [#10]:

А какая между ними разница?
Егор

Егор (статус: 10-ый класс), 4 октября 2009, 12:19 [#11]:

гугл в помощь, а также яндекс:
http://www.sql-ex.ru/help/select5.php
http://www.mysql.ru/docs/man/JOIN.html
http://doc.adiodom.com/blog/archives/35
и т.д.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Александр-вц

Александр-вц (статус: Посетитель), 4 октября 2009, 16:54 [#12]:

Спасибо!
А как сделать чтобы регион выбирпть из списка, а допустим в gride показывались бы объекты, но регионы в списке были бы только те у которых есть объекты?
Егор

Егор (статус: 10-ый класс), 4 октября 2009, 17:48 [#13]:

не понял
хорошо бы привести кусочек каждой из таблиц, а также то, что надо получить в результате запроса(-ов)
а то я так не понимаю :)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Александр-вц

Александр-вц (статус: Посетитель), 5 октября 2009, 23:05 [#14]:

1 табл.

1->Московская
2->Ярославская
3->Воронежская

2 табл.

1->1->АЗС_1
2->1->АЗС_2
3->1->АЗС_3
4->3->АЗС_1
5->3->АЗС_3
6->3->АЗС_8

Хочется по выбору области из ComboBox
в DBGrid получить список объектов.

Но! Если в области нет ни одного объекта, то
и в ComboBox не должена показываться область!!!
Егор

Егор (статус: 10-ый класс), 8 октября 2009, 09:24 [#15]:

хм... странные творятся вещи... :)
я вот тут полез в историю предыдущих вопросов и что нашёл - вопрос 2999, задавался вами же. ответ получен (и даже оценён на 5):

SELECT
  name_reg
FROM
  regions, objects
WHERE
  regions.id=objects.id_reg
GROUP BY
  name_reg;

ну, или с distinct:

SELECT distinct
  name_reg
FROM
  regions, objects
WHERE
  regions.id=objects.id_reg;

каждый из этих запросов и создаст список областей, которые точно содержат хотя бы один объект. если в области объектов нет, в списке она будет отсутствовать.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 8 октября 2009, 09:33 [#16]:

если нужен ещё и id области, то:
SELECT DISTINCT
  regions.id, regions.name_reg
FROM
  regions, objects
WHERE
  regions.id=objects.id_reg;
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 8 октября 2009, 10:18 [#17]:

если затем надо показать в TQuery данные по выбранной области, то сначала считываем название области из combobox'a, а затем формируем нужный запрос:
var
  obl : string;
...
begin
...
  // получим название области
  obl:=ComboBox1.text;
 
  // формируем запрос:
  TQuery1.SQL.Clear;
  TQuery1.SQL.Add('SELECT objects.id, objects.id_reg, objects.name_objects, regions.id, regions.name_reg');
  TQuery1.SQL.Add('FROM regions INNER JOIN objects ON regions.id = objects.id_reg');
  TQuery1.SQL.Add('WHERE regions.name_reg="' + obl + '";');
 
  // выполним запрос:
  TQuery1.Open;
...
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Александр-вц

Александр-вц (статус: Посетитель), 9 октября 2009, 14:51 [#18]:

Спасибо!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:32
Выполнено за 0.04 сек.