我正在尝试从表中获取一些数据,并可能根据另一个查询的结果对其进行过滤。
代码是这样的:
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
))
我的问题是,如果我将当前场景@input
传递为1,那么顶部会返回一些数字:1,2,3
但是如果我将@input
作为2传递,则顶部返回任何内容,因为没有匹配。
这个想法是,如果没有匹配,则返回底部查询中的所有内容,因此从dbo.CPackage
开始,只返回TestID
匹配的内容。
我尝试过使用ISNULL
和collasce
等各种更改联接,案例陈述的内容。此外,我试图删除部分TT.TestID is null
,然后它可以工作,如果顶级表返回一些东西,但当我再次添加它时,它返回所有内容,从不过滤。所以我知道逻辑是错误的...我只是无法找出正确的逻辑....:S
有可能吗?我认为是......
干杯 罗宾
**解决方案**
删除联接并将其放在where过滤器中...
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 )
答案 0 :(得分: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.