2010-12-13 142 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回。不幸的是,在第二種情況下,我收回了所有3條記錄,這是合理的,因爲我的where子句中有OR。我無法弄清楚如何限制我的結果集說「如果我還沒有匹配SourceLevel 2或3,只選擇SourceLevel 1」。

任何人有任何想法,假設這有什麼意義?

爲了澄清:我希望每個FooId從我的結果集,但唯一可用的最具體的FooId的基礎上,SourceLevel參數傳入

+0

您的樣品數據是否正確?第一行和第三行的'SourceLevel'和'SourceId'值相同。 – Tony 2010-12-13 22:14:21

+0

是的,他們是不同的FooIds ...我想要結果中的每個FooId,但只有基於SourceLevel的最具體的FooId。 – Jonas 2010-12-13 22:15:38

+0

我明白了,但是RecordID 1和3的SourceLevel和SourceID完全一樣。如果您使用SourceLevel和SourceID來區分,您將始終獲得兩行。另請參閱Bugai13的答案,他列出了可能的組合。 – Tony 2010-12-13 22:19:29

回答

2

這裏是我落得這樣做:

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 

所有三個記錄將被查詢返回。

0

我不明白這一點,爲什麼它是一個sql問題。但是如果你想SourceLevel 1(我稱之爲SL1現在)只有當你有沒有SL2或SL3 ......

你爲什麼不嘗試用這樣的:

SL2或SL3 OR(NOT SL2 AND NOT SL3和SL1)