2011-09-23 5 views
5

구조가 동일한 두 개의 테이블이 있고 변수를 기반으로 선택할 때 어떤 테이블을 선택할지 결정할 때 프로 시저에서 2 개의 쿼리를 작성해야합니다.조건부 테이블 선택이있는 쿼리를 작성할 수 있습니까

이것이 가능합니까?

내가

declare @table int 
set @table = 1 

Select orderID, Quantity 
from case when @table = 1 then tblOrders else tblSubscriptionOrders end 
where filled = 0 

을 시도하지만 그건

를 작동하지 않았다

답변

6
당신은 일 것이다, (당신이 더 많은 2 만 이상의 테이블을 확장 할 가정)이 동적 SQL을 사용해야합니다

하지만, SQL은 통계를 생성하지 않으며 쿼리를 최적화하는 데 더 힘든 시간을 가지기 때문에 차선책입니다.

declare @table sysname 
declare @SQL varchar(1000) 

set @table = 'MyTable' 
SET @SQL='SELECT orderID, Quantity FROM ' + QUOTENAME(@table) + ' WHERE filled=0' 

exec sp_executesql @SQL 

또는 저장 프로 시저에서 :

CREATE PROCEDURE p_ConditionalSelect @table sysname 
as 

declare @SQL varchar(1000) 

set @table = 'MyTable' 
SET @SQL='SELECT orderID, Quantity FROM ' + QUOTENAME(@table) + ' WHERE filled=0' 

exec sp_executesql @SQL 
+0

일을. 아마도 이것이 나의 노동 조합의 '솔루션'보다 우월 할 가능성이 큽니다. –

+0

최종 결과가 내가 작성한 쉬운 샘플보다 더 복잡하기 때문에 필자는 수행해야하는 솔루션 인 것처럼 보였지만 한 번 실행하기 위해 sp를 작성하는 것을 피하려고했습니다. – Chad

3

하나의 옵션은 동적 SQL을 사용하는 것입니다하지만 성능은 즉각적인 문제가되지 않는 경우, 훨씬 간단는 단지 UNION 테이블 및 더미를 추가 [table] 열을 선택하십시오.

SELECT orderID, Quantity 
FROM (
    SELECT [table] = 1, orderID, Quantity 
    FROM tblOrders 
    UNION ALL 
    SELECT [table] = 2, orderID, Quantity 
    FROM tblSubscriptionOrders 
) t 
WHERE t.Table = @table 
4

단지 두 개의 테이블이 있다면 당신이 할 수 있습니다 :

Declare @table = 1 

SELECT * 
FROM Table1 
WHERE <stuff> 
AND @Table = 1 

UNION ALL 

SELECT * 
FROM Table2 
WHERE <stuff> 
AND @Table = 2 

@table에 필터는 하나의 데이터를 표시하는 두 반쪽의 발생합니다.

+0

+1 테스트를 거치지 않았지만 아직 발표 된 것 중 가장 빠른 해결책이라고 가정합니다. –

2

declare @table int 
set @table = 1 

Select orderID, Quantity 
From tblOrders 
Where @table = 1 
And filled = 0 

UNION ALL 

Select orderID, Quantity 
From tblSubscriptionOrders 
Where @table = 2 
And filled = 0 

또는이 시도 할 수 있습니다 :

declare @table int 
set @table = 1 

if @table = 1 
    Select orderID, Quantity 
    From tblOrders 
    Where filled = 0 
else if @table = 2 
    Select orderID, Quantity 
    From tblSubscriptionOrders 
    Where filled = 0 
관련 문제