2012-11-07 4 views
0

테이블에서 데이터를 가져 와서 다른 쿼리의 결과에 따라 필터링하려고합니다.테이블 결과가 null이 아니면 Sql 쿼리 조인

코드는 다음과 같은 것입니다 :

DECLARE @TestTable TABLE(TestID INT) 

INSERT INTO @TestTable 
SELECT TestID from v_Lookuptable Where SomeID = @input 


SELECT DISTINCT 
C.[Level], 
C.Name 
FROM 
dbo.CPackage CP 
Right outer join @TestTable TT on TT.TestID = CP.TestID 
WHERE 
AND (TT.TestID is null OR Exists(Select TT.TestID from @TestTable 
            inner join dbo.CProduct CP on CP.TestID = MT.TestID 
            where TT.TestID = CP.TestID 
            )) 

내 문제는 내가 현재 시나리오에서 통과하면 1과 @input는 다음 상단 부분이 몇 가지 숫자를 반환한다는 것입니다 : 1, 2, 3

그러나 @input을 2로 전달하면 일치하는 항목이 없으므로 맨 위 부분은 아무 것도 반환하지 않습니다.

일치하는 것이 없으면 맨 아래 쿼리의 모든 내용을 반환하므로 dbo.CPackage에서 TestID과 일치하는 것만 반환하면됩니다.

ISNULLcollasce을 사용하여 조인, 사례 문을 변경하는 등 다양한 작업을 시도했습니다. 또한 부분을 제거하려고했는데 TT.TestID is null 상위 테이블이 뭔가를 반환하면 작동하지만 다시 추가 할 때 모든 것을 반환하고 필터를 적용하지 않습니다. 그래서 나는 논리가 잘못되었다는 것을 안다 ... 나는 이것에 대한 정확한 논리를 이해할 수 없다 .... : S

가능합니까? 나는 ... 그것이 가정

건배 로빈

** 솔루션 **

SELECT DISTINCT 
C.[Level], 
C.Name 
FROM 
dbo.CPackage CP 

WHERE 
CP.TestID = coalesce((select distinct TestID from v_Lookuptable LT 
     where LT.SomeID = @input), CP.TestID) 

답변

1

합니까 ... 가입하고 바로 여기서 필터에 넣어이를 제거 찾고있는 것을 제공하십시오.

SELECT DISTINCT 
     CP.[Level] 
     ,CP.Name 
    FROM dbo.CPackage CP 
    LEFT OUTER JOIN @TestTable TT 
      ON TT.TestID = CP.TestID 
WHERE CP.TestID = ISNULL(TT.TestID, CP.TestID); 

아니면 다음과 같이 전체 검색어를 다시 작성하십시오.

DECLARE @input1 int; 
SET @input1 = ...; 

-- If there are no records returned for v_Lookuptable, then return all records from CPackage. 
-- Otherwise, only return records from CPackage that have a match in the v_Lookuptable where v_Lookuptable.SomeID = @input1. 
SELECT DISTINCT 
     CP.[Level] 
     ,CP.Name 
    FROM dbo.CPackage CP 
    LEFT OUTER JOIN v_Lookuptable TT 
      ON TT.TestID = CP.TestID 
     AND SomeID = @input1 --<== Only include records from TT that match @input1... 
WHERE CP.TestID = ISNULL(TT.TestID, CP.TestID); --<== Return all records from CP if TT is NULL. 
+0

불행히도 작동하지 않습니다. 그것이하는 것처럼 보이는 것은'@TestTable'이 null이고 CP.TestID가 항상 = CP.TestID 일 때입니다. 그래서 항상 모든 것을 돌려줍니다. 아무것도 필터링하지 않습니다 .... TT.TestID와 CP.TestID를 선택하면, 두 번째는 항상 채워지고 첫 번째는 null이거나'@input'에 따라 값으로 채워집니다 .... 희망 그 말이 맞는 ... –

+0

그래서, 명확히하기 위해, 당신이 찾고있는 것은 '@ input1'의 값에 대해'v_Lookuptable'에 일치하는 것이 없다면'CPackage'의 모든 레코드를 반환하는 것입니다. '@ input1'에 대한'v_Lookuptable'에 대한 일치는'v_Lookuptable'에서 일치하는'CPackage'의 레코드만을 포함합니다, 맞습니까? – Alexander

+0

오른쪽에 대한 소리 ... –