2015-03-02 2 views
0

Я пытаюсь написать запрос (Microsoft SQL Server) выглядит как:Tsql Case запрос Постулаты

select productid from T1 
union 
select productid from T2 
union 
select ProductID from T3 

Вопрос заключается в том, что я хочу, чтобы один из этого союза будет зависеть от значения (позволяет говорят @x) Итак, я пишу этот запрос:

select case when @x=1 then productid end 
from T1 
union 
select productid from T2 
union 
select ProductID from T3 

Но его все еще сканировать все T1.

Я знаю, что «Case» сканировать таблицу, даже если его не соответствует условию: выберите случай, когда 1 = 2, то ProductID конец от T1 Как я могу написать запрос, который основывают на значение теперь, если выполнить или не ?? Что-то вроде: Если @ х = 1, затем выберите ProductID из конца T1 .... * Мне нужно найти способ без динамического SQL Благодаря

+2

использовать предложение WHERE в первом члене объединения, например: 'select productid from t1, где @ x = 1 union ...' –

+0

Я не могу, потому что @x является независимым, его не является частью t1. Я также попытался: выберите productid из t1, где существует (@ x = 1), но все же он сканирует все t1, даже когда @x! = 1. –

+0

Тогда объясните, что вы на самом деле пытаетесь сделать, потому что я использовал эту технику успешно и эффективно уже почти три десятилетия. –

ответ

0

использовать это:

Declare @SQL nvarchar(max) 

Set @SQL = N' select productid From T1 ' 
Set @SQl = @SQL + N' UNION select productid From T2' 
if(@x=1) 
Set @SQl = @SQL + N' UNION select productid From T3' 

exec (@SQL) 
0

Большое спасибо за вашу помощь, Мне удается это сделать, как предлагает Питер, с предложением where. Внешний запрос как

select productid from t1 union select productid from t2 
union select productid from t3 inner join t4 on t3.id=t4.t3id where [email protected] 

Хотя я не хотел использовать t4 таблицу (потому что @x это один за всех t3) Спасибо всем.

Смежные вопросы