Join с одной таблицей
Join с одной таблицей
Доброго времени суток!
Наткнулся на такую проблему. Есть таблица 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.
Насколько мне позволяет делать выводы моя грамотность, запрос вроде правильный. Но видимо с одной таблицей так поступать нельзя? Я прав?
Наткнулся на такую проблему. Есть таблица 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.
Насколько мне позволяет делать выводы моя грамотность, запрос вроде правильный. Но видимо с одной таблицей так поступать нельзя? Я прав?
Re: Join с одной таблицей
а зачем тебе именно левый джойн понадобился? Подозреваю, что там нужен внутренний.
Re: Join с одной таблицей
на самом деле все виды джойнов перепробовал, результат одинаковый. Левый вроде как по смыслу подходит, или я заблуждаюсь?
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Join с одной таблицей
Угу, заблуждаешься. И самое твоё большое заблуждение - использование IB6.
Distinct убери и результирующее поле укажи явно как a.Field2.
Distinct убери и результирующее поле укажи явно как a.Field2.
Re: Join с одной таблицей
Вот это я дал. Спасибо. Кстати использую Firebird 1.5.3 и с Distinct нормально работает запрос.
Re: Join с одной таблицей
Автомобиль ездит и с холодильником, погруженным сверху. Но без него тоже ездит, и даже лучше.ILI4 писал(а):Кстати использую Firebird 1.5.3 и с Distinct нормально работает запрос.
Re: Join с одной таблицей
Вы наверное неправильно меня поняли. Distinct мне нужен, потому что мне нужна выборка без повторений.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Join с одной таблицей
Значит заблуждением является использование первого диалекта, поскольку в третьем ты получил бы сообщение об "Ambiguous field name Field2".ILI4 писал(а):Кстати использую Firebird 1.5.3
Re: Join с одной таблицей
Использую 1 Диалект потому что работаю с BDE.Я знаю что это самое большое заблуждение , но никуда от этого деться не могу, проект начал писаться когда еще третьего диалекта не было и в помине, а все переделывать просто нет времени и возможности.
А как использовать Join если у меня 4-е таблицы??
Проблема в том что везде описывается как подключать 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'
Что тут не так??
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'
Что тут не так??
Re: Join с одной таблицей
точно так же. интересный у Вас запрос. столбцы от четырех полей, а объединяете две. Это как?
Вы бы посмотрели www.ibase.ru/devinfo/joins.htm . там есть примеры всякого
Вы бы посмотрели www.ibase.ru/devinfo/joins.htm . там есть примеры всякого