| 
| 
 | Вопрос # 3 249/ вопрос открыт / | 
 |  Здравствуйте!Есть две таблицы. Как их связать, используются ADOQuery?
 
|  |   Вопрос задал: Александр-вц (статус: Посетитель)Вопрос отправлен: 3 октября 2009, 20:18
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Егор Здравствуйте, Александр-вц!В свойство SQL компонента прописываем запрос (см. приложение).
 Можно убрать некоторые поля.
 Приложение:Переключить в обычный режим   SELECT  objects.id, objects.id_reg, objects.name_objects, regions.id, regions.name_regFROM  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]:А какая между ними разница? |  
|   | Александр-вц (статус: Посетитель), 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.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |