Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Left / Right join в зависимости от параметра  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Собственно сабж. Требуется что-то вроде:

select * from table1 t1
case when flag = 0 then left join else right join end
table2 t2 on t2.id = t1.id


Подскажите как это лучше всего реализовать.
1 фев 13, 15:50    [13862676]     Ответить | Цитировать Сообщить модератору
 Re: Left / Right join в зависимости от параметра  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Remind,

if @flag = 0
    select * from table1 t1 left join table2 t2 on t2.id = t1.id
else
    select * from table1 t1 right join table2 t2 on t2.id = t1.id
1 фев 13, 16:05    [13862808]     Ответить | Цитировать Сообщить модератору
 Re: Left / Right join в зависимости от параметра  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Remind,

навскидку

select * 
from table1 t1
full join table2 t2 on t2.id = t1.id
where (flag = 0 and t2.id is null) or (flag <> 0 and t1.id is null)


или подобно же через union all
1 фев 13, 16:09    [13862838]     Ответить | Цитировать Сообщить модератору
 Re: Left / Right join в зависимости от параметра  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Shakill, всё не так, надо

select * 
from table1 t1
full join table2 t2 on t2.id = t1.id
where (flag = 0 and t1.id is not null) or (flag <> 0 and t2.id is not null)
1 фев 13, 16:13    [13862863]     Ответить | Цитировать Сообщить модератору
 Re: Left / Right join в зависимости от параметра  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Shakill
select * 
from table1 t1
full join table2 t2 on t2.id = t1.id
where (flag = 0 and t2.id is null) or (flag <> 0 and t1.id is null)

Ответ неверный. Из вашего итогового результата исключается результат inner join'а этих таблиц. Для left/right join'ов такого не происходит.
1 фев 13, 16:17    [13862894]     Ответить | Цитировать Сообщить модератору
 Re: Left / Right join в зависимости от параметра  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Shakill
Shakill, всё не так, надо

select * 
from table1 t1
full join table2 t2 on t2.id = t1.id
where (flag = 0 and t1.id is not null) or (flag <> 0 and t2.id is not null)

А теперь представим, что в одной таблице миллион записей, а во второй — одна запись. Оптимальные планы для left/right join'ов должны существенно различаться для этих случаев.
1 фев 13, 16:19    [13862910]     Ответить | Цитировать Сообщить модератору
 Re: Left / Right join в зависимости от параметра  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Гость333
Shakill
Shakill, всё не так, надо

select * 
from table1 t1
full join table2 t2 on t2.id = t1.id
where (flag = 0 and t1.id is not null) or (flag <> 0 and t2.id is not null)

А теперь представим, что в одной таблице миллион записей, а во второй — одна запись. Оптимальные планы для left/right join'ов должны существенно различаться для этих случаев.


ну вот тогда

select * from table1 t1 left join table2 t2 on t2.id = t1.id where flag = 0
union all
select * from table1 t1 right join table2 t2 on t2.id = t1.id where flag <> 0
1 фев 13, 16:32    [13862978]     Ответить | Цитировать Сообщить модератору
 Re: Left / Right join в зависимости от параметра  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Спасибо, вариант с if else мне больше нравится
1 фев 13, 18:13    [13863640]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить