如果表结果不为null,则为SQL查询连接

时间:2012-11-07 02:10:36

标签: 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等各种更改联接,案例陈述的内容。此外,我试图删除部分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 )

1 个答案:

答案 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.