2014-09-01 2 views
1

У меня есть запрос, как:SQL условный Вложенный запрос

select * 
from BASE_TABLE 
inner join (
    select * from TABLE_A 
) t on BASE_TABLE.ID = t.ID 

и хотите сделать Вложенный запрос условно, что-то вроде:

select * 
from BASE_TABLE 
inner join (
    if @var = 1 
     select * from TABLE_A 
    else 
     select * from TABLE_B 
) t on BASE_TABLE.ID = t.ID 

Возможно ли это? Запрос используется внутри хранимой процедуры. Решение должно работать для SQL Server и Oracle или, по крайней мере, для SQL Server.

+0

Вы читали аналогичный вопрос о SO? Посмотрите здесь: http://stackoverflow.com/a/1850031/1083946. –

ответ

0

Я хотел бы сделать это следующим образом (но тогда вам нужно указать поля, вы не можете использовать select * синтаксис):

select base.ID, base.Field1, base.Etc, Field1 = case when @var=1 then a.Field1 else b.Field1 end, 
     Field2 = case when @var=1 then a.Field2 else b.Field2 end 
    from BASE_TABLE base 
    left join TABLE_A a on base.ID = a.ID 
    left join TABLE_B b on base.ID = b.ID 
2

Как об этом:

SELECT 
    * 
FROM 
    BASE_TABLE 
    INNER JOIN (
    SELECT col1, col2, colN FROM TABLE_A WHERE @var IN (1) -- "if" 
    UNION 
    SELECT col1, col2, colN FROM TABLE_B WHERE @var IN (2) -- "else if" 
    UNION 
    SELECT col1, col2, colN FROM TABLE_C WHERE @var NOT IN (1, 2) -- "else" 
) t ON t.ID = BASE_TABLE.ID 
+0

Не могли бы вы объяснить, почему здесь подходит союз. Правильно ли работает, если 2 набора результатов имеют одинаковые строки? – ako

+1

Союз подходит здесь, потому что предложения 'WHERE' являются взаимоисключающими. Я думал, это будет очевидно. – Tomalak

+0

Да, правильно. Я должен быть внимательнее. – ako

0

пожалуйста, попробуйте ниже запрос

declare @var int=1 
declare @qry nvarchar(max) 
set @qry='select * from BASE_TABLE (' 
if @var=1 
set @[email protected]+ 'select * from TABLE_A' 
else 
set @[email protected]+ 'select * from TABLE_B' 

set @[email protected]+')t on BASE_TABLE.ID = t.ID' 

exec (@qry) 
Смежные вопросы