테이블에서 데이터를 가져 와서 다른 쿼리의 결과에 따라 필터링하려고합니다.테이블 결과가 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
과 일치하는 것만 반환하면됩니다.
ISNULL
및 collasce
을 사용하여 조인, 사례 문을 변경하는 등 다양한 작업을 시도했습니다. 또한 부분을 제거하려고했는데 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)
불행히도 작동하지 않습니다. 그것이하는 것처럼 보이는 것은'@TestTable'이 null이고 CP.TestID가 항상 = CP.TestID 일 때입니다. 그래서 항상 모든 것을 돌려줍니다. 아무것도 필터링하지 않습니다 .... TT.TestID와 CP.TestID를 선택하면, 두 번째는 항상 채워지고 첫 번째는 null이거나'@input'에 따라 값으로 채워집니다 .... 희망 그 말이 맞는 ... –
그래서, 명확히하기 위해, 당신이 찾고있는 것은 '@ input1'의 값에 대해'v_Lookuptable'에 일치하는 것이 없다면'CPackage'의 모든 레코드를 반환하는 것입니다. '@ input1'에 대한'v_Lookuptable'에 대한 일치는'v_Lookuptable'에서 일치하는'CPackage'의 레코드만을 포함합니다, 맞습니까? – Alexander
오른쪽에 대한 소리 ... –