0
我想从表中获取一些数据,并可能根据另一个查询的结果对其进行过滤。如果表结果不为空,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
))
我的问题是,如果我通过我的当前情况下的@input
为1,则顶部返回一些数字:1,2,3
但是,如果我将@input
设为2,则顶部不返回任何内容,因为没有任何匹配。
这个想法是,如果没有匹配,返回底部查询中的所有内容,所以从dbo.CPackage
,否则,只返回TestID
匹配的东西。
我已经尝试过使用ISNULL
和collasce
更改联接,case语句等各种事情。此外,我试图删除部分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”为空,那么CP.TestID将总是= CP.TestID。所以它总是返回一切。它永远不会过滤掉任何东西....如果你添加到选择的TT.TestID和CP.TestID,第二个总是填充,第一个为空或者根据@input来填充一个值.... Hope这是有道理的...... –
所以,只是为了澄清,你要找的是如果'@ input1'中的值'v_Lookuptable'没有匹配,则返回'CPackage'的所有记录,而如果存在'@ input1'的'v_Lookuptable'上的匹配,然后只包含'CPackage'中的记录,它们在'v_Lookuptable'中有匹配,对吧? – Alexander
听起来是对的...... –