Join с одной таблицей

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
ILI4
Сообщения: 21
Зарегистрирован: 07 сен 2006, 15:21

Join с одной таблицей

Сообщение ILI4 » 04 дек 2008, 17:18

Доброго времени суток!
Наткнулся на такую проблему. Есть таблица Table1, в ней два поля field1 и field2. Задача заключается в следующем : по значению поля field2 выбрать из этой таблицы все значения поля field2, у которые связаны с заданным по полю field1, то есть:
Table 1
Field1 Field2
1 2
1 3
1 5
2 3
2 7
3 2
3 5
то есть данный запрос для значения 2 должен получить выборку (2;3;5), для 3 - (2;3;5;7) и т. д.

Конечно, самый простой вариант :

select distinct field2 from Table1 where Field1 in (select distinct field1 from Table1 where Field2=2)

но по скорости вариант не супер.
Я решил сделать join:

select distinct Field2 from Table1 a
left join Table1 b on a.field1=b.field1
where b.field2 = 2

в результате получаю только одну запись с 2.
Насколько мне позволяет делать выводы моя грамотность, запрос вроде правильный. Но видимо с одной таблицей так поступать нельзя? Я прав?

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Join с одной таблицей

Сообщение dimitr » 04 дек 2008, 17:51

а зачем тебе именно левый джойн понадобился? Подозреваю, что там нужен внутренний.

ILI4
Сообщения: 21
Зарегистрирован: 07 сен 2006, 15:21

Re: Join с одной таблицей

Сообщение ILI4 » 04 дек 2008, 18:34

на самом деле все виды джойнов перепробовал, результат одинаковый. Левый вроде как по смыслу подходит, или я заблуждаюсь?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Join с одной таблицей

Сообщение Dimitry Sibiryakov » 04 дек 2008, 18:41

Угу, заблуждаешься. И самое твоё большое заблуждение - использование IB6.

Distinct убери и результирующее поле укажи явно как a.Field2.

ILI4
Сообщения: 21
Зарегистрирован: 07 сен 2006, 15:21

Re: Join с одной таблицей

Сообщение ILI4 » 04 дек 2008, 18:46

Вот это я дал. Спасибо. Кстати использую Firebird 1.5.3 и с Distinct нормально работает запрос.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Join с одной таблицей

Сообщение WildSery » 04 дек 2008, 19:04

ILI4 писал(а):Кстати использую Firebird 1.5.3 и с Distinct нормально работает запрос.
Автомобиль ездит и с холодильником, погруженным сверху. Но без него тоже ездит, и даже лучше.

ILI4
Сообщения: 21
Зарегистрирован: 07 сен 2006, 15:21

Re: Join с одной таблицей

Сообщение ILI4 » 05 дек 2008, 10:41

Вы наверное неправильно меня поняли. Distinct мне нужен, потому что мне нужна выборка без повторений.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Join с одной таблицей

Сообщение Dimitry Sibiryakov » 05 дек 2008, 12:22

ILI4 писал(а):Кстати использую Firebird 1.5.3
Значит заблуждением является использование первого диалекта, поскольку в третьем ты получил бы сообщение об "Ambiguous field name Field2".

ILI4
Сообщения: 21
Зарегистрирован: 07 сен 2006, 15:21

Re: Join с одной таблицей

Сообщение ILI4 » 05 дек 2008, 13:00

Использую 1 Диалект потому что работаю с BDE.Я знаю что это самое большое заблуждение :D , но никуда от этого деться не могу, проект начал писаться когда еще третьего диалекта не было и в помине, а все переделывать просто нет времени и возможности.

SOVa
Сообщения: 1
Зарегистрирован: 01 июн 2009, 17:54

А как использовать Join если у меня 4-е таблицы??

Сообщение SOVa » 01 июн 2009, 18:02

Проблема в том что везде описывается как подключать join при двух таблицах а если их четыре как работает "and" в JOIN ???

SELECT Vid_rabot.Nazv, Skvagina.Nomer, Obect_VR_Skv.Data_plan, Obect_VR_Skv.Data_fact
FROM Obect_VR_Skv JOIN Obect
ON Obect_VR_Skv.KodSkv = Skvagina.KodSkv
AND Obect_VR_Skv.IdVR=Vid_rabot.IdVR
WHERE Obect.Kod='1'


Что тут не так??

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Join с одной таблицей

Сообщение kdv » 01 июн 2009, 18:29

точно так же. интересный у Вас запрос. столбцы от четырех полей, а объединяете две. Это как?
Вы бы посмотрели www.ibase.ru/devinfo/joins.htm . там есть примеры всякого

Ответить