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

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

Вопрос о запросе.. [D6]


DROWSY ©   (2010-06-11 05:34:00) 

Firebird 1.5

В таблице Main есть два внешних ключа (D1, D2) к таблице Dep.
Мне нужен запрос, возвращающий записи, содержащие все поля Main, все поля Dep записи по коду D1
и все поля Dep записи  по коду D2.

Написал такой запрос:


select distinct поля Main,поля Dep, поля Dep1
from Main
  inner join Main Main1 on (Main.code = Main1.code)
  inner join Dep          on (Main.D1   = Dep.code)
  inner join Dep  Dep1  on (Main1.D2  = Dep1.code)


Можно ли и как сделать по-другому, правильнее?


sniknik   (2010-06-12 11:03:00) [1]

> Мой запрос медленно исполняется
ну а чего ты хотел? делаешь декартово произведение таблицы самой на себя, добавляешь к ней данные другой таблицы а после дистинктом убираешь лишние, которые сам же и создал...

> inner join Main Main1on ( Main.code = Main1.code)
объясни вот, что это за фигня?


DROWSY   (2010-06-12 05:05:00) [2]


> 12 ©   (11.06.10 08:37) [3]


> И. Павел ©   (11.06.10 08:44) [4]

Нет, мне нужен запрос, который даёт те же результаты, что и
такой:


select distinct поля Main,поля Dep, поля Dep1
from Main
 inner join Main Main1 on (Main.code = Main1.code)
 inner join Dep          on  (Main.D1   = Dep.code)
 inner join Dep  Dep1  on (Main1.D2  = Dep1.code)


То есть, результат - записи такого типа:
Main.D1, Main.D2,.. все поля Main1...,
все поля записи таблицы Dep, где Main.D1 = Dep.Code,
все поля записи таблицы Dep, где Main.D2 = Dep.Code

Мой запрос медленно исполняется и выглядит коряво, а потому, видимо, далеко не оптимальный.


И. Павел   (2010-06-11 08:44:00) [3]

> [0] DROWSY

Наверное, можно сократить запрос до такого вида:
select distinct поля Main,поля Dep, поля Dep1
from Main
inner join Dep on (Main.D1   = Dep.code) or (Main.D2  = Dep.code)


12   (2010-06-11 08:37:00) [4]

т.е.

select поля Main,поля Dep
from Main
inner join Dep          on (Main.D1   = Dep.code)
union
select поля Main,поля Dep
from Main
inner join Dep          on (Main.D2   = Dep.code)


12   (2010-06-11 08:31:00) [5]

FB не юзал, но может юнион двух простых джойнов?

а это зачем и что это вообще, какой смысл?

> inner join Main Main1 on (Main.code = Main1.code)


И. Павел   (2010-06-11 08:08:00) [6]

Если я правино понял, что нужно сделать, то третья строчка не нужна.


Наверх

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