Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объединение многих таблиц (>2) через INNER JOIN, типа урок, т.к. сам постоянно путываюсь 
:(
    Опции темы
demoded
Дата 17.3.2008, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 7.12.2006

Репутация: нет
Всего: нет



как правило на вопрос новичков как собрать кучку из нескольких таблиц все советуют: "собрать запрос в конструкторе 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 
PM MAIL   Вверх
BDmV
Дата 17.3.2008, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 14.5.2005

Репутация: 1
Всего: 1



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'овский конструктор, так же как и Дельфиный, ИМХО, подходят только для того чтоб ручками не писать имена таблиц, полей, команд и т.д... и изделия этих конструкторов подлежат обязательной правки...

Это сообщение отредактировал(а) BDmV - 17.3.2008, 14:21
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0814 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.