Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Объединение многих таблиц (>2) через INNER JOIN


Автор: demoded 17.3.2008, 13:33
как правило на вопрос новичков как собрать кучку из нескольких таблиц все советуют: "собрать запрос в конструкторе Access и потом вставить его в код". этот способ прекрастно работает, но желание разобраться с этим таинством у меня чесалось всегда...

итак есть 4 таблицы

Orders (заказы)
Dogovor (договора)
Modul (макеты)
Themes (рубрики)

начнем с начала выберем все заказы за период

Код

SELECT ZakazID 
FROM Orders
WHERE Orders.Date>=#1/1/2008# AND Orders.Date<=#1/31/2008#


теперь присоединим договора по полю ZakazID с помощью INNER JOIN

Код

SELECT ZakazID 
FROM Orders INNER JOIN Dogovor ON Dogovor.ZakazID=Orders.ZakazID
WHERE Orders.Date>=#1/1/2008# AND Orders.Date<=#1/31/2008#


это самое простое. теперь чтобы добавить еще одну таблицу, берем все что записано после FROM в скобки и дописываем еще один INNER JOIN

Код

SELECT ZakazID 
FROM (Orders INNER JOIN Dogovor ON Dogovor.ZakazID=Orders.ZakazID) INNER JOIN Modul ON Modul.ZakazID=Orders.ZakazID
WHERE Orders.Date>=#1/1/2008# AND Orders.Date<=#1/31/2008#


ну и для закрепления добавим еще одну таблицу с названиями рубрик

Код

SELECT ZakazID 
FROM ((Orders INNER JOIN Dogovor ON Dogovor.ZakazID=Orders.ZakazID) INNER JOIN Modul ON Modul.ZakazID=Orders.ZakazID) INNER JOIN Themes ON Themes.ThemeID=Modul.ThemeID
WHERE Orders.Date>=#1/1/2008# AND Orders.Date<=#1/31/2008#


надеюсь кому-нибудь пригодиться  smile 

Автор: BDmV 17.3.2008, 14:15
smile Только я бы INNER JOIN заменил на LEFT JOIN и тем самым увеличил скорость сборки данных и избавился от дублирующих записей, которые иногда появляются при полной сцепки таблиц.
Код

SELECT ZakazID 
FROM ((Orders LEFT JOIN Dogovor ON Dogovor.ZakazID=Orders.ZakazID) LEFT JOIN Modul ON Modul.ZakazID=Orders.ZakazID) LRFT JOIN Themes ON Themes.ThemeID=Modul.ThemeID
WHERE Orders.Date>=#1/1/2008# AND Orders.Date<=#1/31/2008#

ЗЫ. Кстати не все SQL языки способны переварить вложенные скобки. Для MySQL, ИМХО, лучше писать так
Код

SELECT t1.*, t2.*, t3.*, t4.*
FROM Orders t1 LEFT JOIN Dogovor t2 ON (Dogovor.ZakazID=Orders.ZakazID) LEFT JOIN 
                                                   Modul t3 ON (Modul.ZakazID=Orders.ZakazID) LEFT JOIN 
                                                   Themes t4 ON (Themes.ThemeID=Modul.ThemeID)
WHERE Orders.Date>=#1/1/2008# AND Orders.Date<=#1/31/2008#

Так что Access'овский конструктор, так же как и Дельфиный, ИМХО, подходят только для того чтоб ручками не писать имена таблиц, полей, команд и т.д... и изделия этих конструкторов подлежат обязательной правки...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)