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