2010-12-13 144 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)