Left / Right join в зависимости от параметра

Remind
Дата: 01.02.2013 15:50:00
Собственно сабж. Требуется что-то вроде:

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


Подскажите как это лучше всего реализовать.
Гость333
Дата: 01.02.2013 16:05:40
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
Shakill
Дата: 01.02.2013 16:09:46
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
Shakill
Дата: 01.02.2013 16:13:16
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)
Гость333
Дата: 01.02.2013 16:17:10
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'ов такого не происходит.
Гость333
Дата: 01.02.2013 16:19:24
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'ов должны существенно различаться для этих случаев.
Shakill
Дата: 01.02.2013 16:32:46
Гость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
Remind
Дата: 01.02.2013 18:13:10
Спасибо, вариант с if else мне больше нравится