2010-12-13 16 views
0

私はSQLクエリで困惑しています。クエリでSQLクエリの混乱

、私は結果がそうのように設定されている:私は、パラメータを渡すと、そのクエリに

FooId  Name  Value  SourceLevel SourceId RecordId 
----------------------------------------------------------------- 
    1  'Foo'  10    1   0   1 
    1  'Foo'  25    3   1   2 
    2  'Bar'  33    1   0   3 

@ Level1Level、@ Level2Level、@ Level3Level、および@ Level1Id、@ Level2Id、@ Level3Id

(いいえ、実際の名前ではありませんが、私の要点を示しています)。私はそうのようなパラメータを渡す場合

WHERE ((SourceLevel = @Level1Level AND SourceId = @Level1Id) 
OR (SourceLevel = @Level2Level AND SourceId = @Level2Id) 
OR (SourceLevel = @Level3Level AND SourceId = @Level3Id)) 

私のクエリは次のようにフィルタをやろうとしている

@Level1Level = 1, @Level2Level = 2, @Level3Level = 3 
@Level1Id = 0, @Level2Id = 3, @Level3Id = 2 

私はrecordIds 1と3バックをしたいと思います。

しかし、私はそうのようなパラメータを渡す場合:

@Level1Level = 1, @Level2Level = 2, @Level3Level = 3 
@Level1Id = 0, @Level2Id = 3, @Level3Id = 1 

私はrecordIds 2と3バックをしたいと思います。残念ながら、2番目のケースでは、3つのレコードすべてを元に戻しています。これは、where句のORのために意味があります。 "SourceLevel 2または3でまだ一致していなければ、SourceLevel 1のみを選択する"と言うように結果セットを制限する方法を理解できません。

これは何らかの意味があるとすれば、誰でも考えていますか?明確にするために

:私は私の結果セットから各FooIdをしたいが、渡されたSourceLevelパラメータに基づいて、利用可能な唯一の最も具体的なFooId、

+0

サンプルデータは正しいですか? 1行目と3行目の 'SourceLevel'と 'SourceId'の値は同じです。 – Tony

+0

はい、彼らは異なったFooIdsです...私は結果にFooIdをそれぞれ必要としますが、SourceLevelに基づいて最も特定のFooIdのみが必要です。 – Jonas

+0

私は理解していますが、RecordID 1と3のSourceLevelとSourceIDはまったく同じです。差別化のためにSourceLevelとSourceIDを使用している場合は、常に両方の行が取得されます。 Bugai13の回答も参照してください。彼は可能な組み合わせをマップしています。 – Tony

答えて

2

)SL3とSL1ないでここに私がやってしまったものです:

WHERE 
(
    (SourceLevel = @Level3Level AND SourceId = @Level3Id) 
    OR 
    (
    SourceLevel = @Level2Level AND SourceId = @Level2Id 
    AND NOT EXISTS (SELECT 'X' FROM SourceTable WHERE SourceLevel = @Level3Level And SourceId = @Level3Id AND FooId = SourceTable.FooId) 
) 
    OR 
    (
    SourceLevel = @Level1Level AND SourceId = @Level1Id 
    AND NOT EXISTS (SELECT 'X' FROM SourceTable WHERE SourceLevel = @Level3Level And SourceId = @Level3Id AND FooId = SourceTable.FooId) 
    AND NOT EXISTS (SELECT 'X' FROM SourceTable WHERE SourceLevel = @Level2Level And SourceId = @Level2Id AND FooId = SourceTable.FooId) 
) 
) 

これは、私は質問がとても混乱したことを後に...申し訳ありませんでしたフィルタリングを行うようです。 :)

0
(SourceLevel = 1 AND SourceId = 0) match 1 and 3 records 
(SourceLevel = 2 AND SourceId = 3) no matches 
(SourceLevel = 3 AND SourceId = 1) match 2 record 

すべての3つのレコードがクエリによって返されます。

0

私は正確にポイントと、なぜそれがSQLの質問であるとは思わない。

SL2 OR SL3 OR(NOT SL2:しかし、あなたは...あなたはまだSL2かSL3いない場合にのみ、(私は今SL1それを呼び出す)

をSourceLevel 1をしたい場合は、これにしようとしない理由AND