我正在尝试从表中获取一些数据,并可能根据另一个查询的结果对其进行过滤。
代码是这样的:
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
as 1,那么顶部会返回一些数字:1、2、3
但是如果我作为 2 传递@input
,那么顶部不会返回任何内容,因为没有匹配项。
这个想法是,如果没有匹配项,则返回底部查询中的所有内容,因此 from dbo.CPackage
,否则只返回TestID
匹配的内容。
我尝试了各种方法,例如更改联接、case 语句、使用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 )