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

私の問題は、現在のシナリオ@inputを1として渡すと、上部がいくつかの数値を返すことです:1、2、3

しかし、私が2として合格@inputした場合、一致するものがないため、上部は何も返しません。

一致するものがない場合は、一番下のクエリですべてを返すのでdbo.CPackage、それ以外の場合は、一致するものだけを返すという考え方ですTestID

結合の変更、caseステートメント、using 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 )
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 に答える