2012-11-07 176 views
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匹配的东西。

我已经尝试过使用ISNULLcollasce更改联接,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) 

回答

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); 

或者,你甚至可以t o像这样重写整个查询:

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”为空,那么CP.TestID将总是= CP.TestID。所以它总是返回一切。它永远不会过滤掉任何东西....如果你添加到选择的TT.TestID和CP.TestID,第二个总是填充,第一个为空或者根据@input来填充一个值.... Hope这是有道理的...... –

+0

所以,只是为了澄清,你要找的是如果'@ input1'中的值'v_Lookuptable'没有匹配,则返回'CPackage'的所有记录,而如果存在'@ input1'的'v_Lookuptable'上的匹配,然后只包含'CPackage'中的记录,它们在'v_Lookuptable'中有匹配,对吧? – Alexander

+0

听起来是对的...... –