0

我正在尝试从表中获取一些数据,并可能根据另一个查询的结果对其进行过滤。

代码是这样的:

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

我的问题是,如果我在当前场景中传递@inputas 1,那么顶部会返回一些数字:1、2、3

但是如果我作为 2 传递@input,那么顶部不会返回任何内容,因为没有匹配项。

这个想法是,如果没有匹配项,则返回底部查询中的所有内容,因此 from dbo.CPackage,否则只返回TestID匹配的内容。

我尝试了各种方法,例如更改联接、case 语句、使用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 )
4

1 回答 1

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.
于 2012-11-07T03:23:37.680 回答