Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Объединение трех таблиц


Alex8 ©   (2007-11-04 08:01:00) 

Здраствуйте !
 Подскажите, пожалуйста, как объединить 3 таблицы (T1, T2, T3).
Пробовал разные варианты. Например, один из них:

SELECT T1.p1, T2.p2, T3.p3 FROM T1  LEFT OUTER JOIN T2  ON <условие>....???     LEFT OUTER JOIN T3  ON  <условие>.. WHERE.....

Спасибо.


Anatoly Podgoretsky   (2007-11-04 18:10:00) [1]

> Alex8  (04.11.2007 17:53:18)  [18]

Соединение по одному из множества соединений, описано в справке.


Alex8   (2007-11-04 17:53:00) [2]

> Anatoly Podgoretsky ©   (04.11.07 14:42) [15]

>  А вот что ты действительно  хочешь сделать, то об этом не говоришь,

  Прошу прощения, но я рискну признаться, что я действительно, не вижу разницы между  обЪединением и соединением,  когда речь
идет о выборках. Каюсь. Но врядли стоит дискутировать по этому поводу.    

    А теперь, что я хочу сделать.
Я хочу получить выборку данных из 3-х файлов. 1-й содержит основную
информацию. Два других ее детализируют. Для одних записей файла-1
детализации нет, для других она размещается в группе записей файла-2,
для третьих помимо некоторые записи файла-2 детализируются далее в
группе записей файла-3. Наконец, есть записи файла-1, которые детализируются только в файле-1 (без файла-2).
   Отсюда, возникает вопрос как получить выборку ?
Выполнять одну общую выборку по схеме
 SELECT T1.p1, T2.p2, T3.p3 FROM T1, T2, T3 ......
или выполнять последовательно три выборки (из  T1, T2, T3 )   и затем
обЪединить (или соединить) полученные результаты. Что проще и эффективнее.
  Попутно возник ворпос о том как использовать конструкцию
LEFT OUTER JOIN < >  ON <> в случае трех файлов (1-й вариант организации выборки).
  Интуитивно я склоняюсь к 1 варианту.
  Хотелось бы узнать Ваше мнение по этому поводу.


Anatoly Podgoretsky   (2007-11-04 16:03:00) [3]

Странный у тебя какой то Help
У меня сразу указывает на приведеное.


Alex8   (2007-11-04 15:58:00) [4]

> sniknik ©   (04.11.07 14:38) [14]

 У нас. видно, разные "Help" .
По Вашей любезной рекомендации набрал в Предметном
указателе Local SQL "OUTER join" и обнаружил там только
Local SQL (т.е. "OUTER join" отсутствует).
  Дальше, развивая Local SQL, попадаю в раздел
"Productivity Tools",  где около 10 позиций и ни в одной
из них нет даже упоминания о  "OUTER join".
  Жалко. Но ознакомиться с указанным разделом не смог.


Anatoly Podgoretsky   (2007-11-04 14:42:00) [5]


> Ну пусть соединение. Ведь ясно, о чем речь.

Не ясно, возможно ты действительно говоришь об объединение, но не знаешь как это делается, или ты говоришь об соединении, но почему то называешь это объединение. А вот что ты действительно хочешь сделать, то об этом не говоришь, предпочитая кидать какой то код.


sniknik   (2007-11-04 14:38:00) [6]

> Посмотрел (дольше 5 минут), но самого синтаксиса
> не нашел.
набираешь в предметном указателе справки по Local SQL "OUTER join"
первыми же строками идет
Joins two tables based on column values common between the two, including non-matches.

SELECT column_list
FROM table_reference
  LEFT | RIGHT | FULL [OUTER] JOIN table_reference
   ON predicate
 [LEFT | RIGHT | FULL [OUTER] JOIN table_reference
   ON predicate...]
....


английский даже и не нужен. синтаксис как раз на примере соединения 2х таблиц... добавление 3-й, 4-й, ...  по аналогичной логике, не тебует объяснений (иначе бы они были там же в хелпе)


Alex8   (2007-11-04 14:09:00) [7]

> синтаксис Local SQL тайной не является

 Но не при моем ужасном английском.
Посмотрел (дольше 5 минут), но самого синтаксиса
не нашел.    

Спасибо всем за участие.


sniknik   (2007-11-04 13:38:00) [8]

Alex8   (04.11.07 13:18) [9]
осталось еще "а что именно ты хочеш получить?"

Kolan ©   (04.11.07 13:23) [10]
имхо, объединение лучше писать явно...
у тебя ошибка "перевода", LEFT OUTER в запросе выше это скорее T1.ID <> T2.ID чем равно (вернее должно быть так *=, все с одной стороны независимо от равенства, но такого синтаксиса в BDE вроде нет).
хотя, без ответа на оставшийся (см. выше) вопрос to Alex8, с уверенностью этого сказать нельзя... а вдруг именно это ему и нужно?

Alex8
синтаксис Local SQL тайной не является, и есть в хелпе при установленном дельфи... вполне мог за 5 мин посмотреть там... чем полдня здесь... (хотя конечно многих "мудрых" ;о) мыслей бы не услышал...)


Alex8   (2007-11-04 13:35:00) [9]

> Kolan ©   (04.11.07 13:23) [10]
> Так?

Может быть. Надо подумать и проверить.
 Что-то похожее я делал, только не "AND" , а "OR" .
Результат - астрономическое число записей.
 Возможно потому, что нет взаимной однозначности записей.
Во всяком случае я попробую.


Kolan   (2007-11-04 13:23:00) [10]

SELECT * FROM Т1, Т2, Т3
WHERE (T1.ID = T2.ID) AND (T2.ID = T3.ID)

Так?


Alex8   (2007-11-04 13:18:00) [11]

> синтаксис, и вообще возможность,  зависит от непоказанного
> типа базы (движка)...
> и кстати, ни один движок не воспринимает многоточие в запросах.

 Убрали многоточия.  База-"PARADOX".

Файлы для выборки Т1, Т2, Т3.

Некоторым (не всем) записям в Т1 соответствует (по ключу) группа записей из Т2, аналогично  некоторым  записям в Т2 соответствует группа записей из Т3.


sniknik   (2007-11-04 13:07:00) [12]

> Ведь ясно, о чем речь.
а вот тут ты ошибаешься, причем очень серьезно.


sniknik   (2007-11-04 13:06:00) [13]

> Еще раз, нет здесь объединения!!!
напомнило.

кстати о терминах "2 последовательные выборки" это пакет  вот так
SELECT * FROM T1

SELECT * FROM T2

то что ты возможно имеешь в виду это подзапрос.


Alex8   (2007-11-04 13:05:00) [14]

> Еще раз, нет здесь объединения!!!

Ну пусть соединение. Ведь ясно, о чем речь.


sniknik   (2007-11-04 13:03:00) [15]

> а если 3 и нужно сделать 2 последовательные выборки?
синтаксис, и вообще возможность,  зависит от непоказанного типа базы (движка)...
и кстати, ни один движок не воспринимает многоточие в запросах...


Anatoly Podgoretsky   (2007-11-04 12:58:00) [16]


> Alex8   (04.11.07 12:50) [3]

Еще раз, нет здесь объединения!!!


Alex8   (2007-11-04 12:50:00) [17]

Согласен. Плохо сформулирован вопрос.
Но я имел ввиду объединение с использованием
      LEFT OUTER JOIN ....  ON <условие>....

Когда 2 таблицы, все ясно, а если 3 и нужно сделать 2 последовательные
выборки?

М.б так:
SELECT T1.p1, T2.p2, T3.p3 FROM SELECT T3.p3, T2.p2 LEFT OUTER JOIN T2  ON <условие>....  FROM  LEFT OUTER JOIN T1  ON <условие>....


Anatoly Podgoretsky   (2007-11-04 12:34:00) [18]

Это соединение, а не объединение, объединение делается через UNION


DrPass   (2007-11-04 11:40:00) [19]


> Alex8   (04.11.07 08:01)  

Здравствуйте!
Подскажите пожалуйста, куда я вчера положил колбасу
Пробовал разные варианты. Например, один из них:

Заглянул в шкафчик на кухне

Спасибо.

Попробуй ответить на мой вопрос, а тогда можно будет ответить на твой. Он по смыслу абсолютно такой же.


Наверх

Титульная страница Поиск, карта сайта Написать письмо