SQL查询混乱

时间:2010-12-13 21:55:55

标签: 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

我希望记录1和3回来。

但是,如果我传递这样的参数:

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

我希望记录2和3回来。不幸的是,在第二种情况下,我得到了所有3条记录,这是有道理的,因为我的where子句中的OR。我无法弄清楚如何限制我的结果集说“如果我还没有在SourceLevel 2或3上匹配,则只选择SourceLevel 1”。

任何人都有任何想法,假设这有任何意义吗?

澄清一下:我想从我的结果集中获取每个FooId,但是根据传入的SourceLevel参数,只需要最具体的FooId。

3 个答案:

答案 0 :(得分: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)
  )
)

这似乎是我过滤后的过滤...抱歉这个问题太混乱了。 :)

答案 1 :(得分: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

查询将返回所有三条记录。

答案 2 :(得分:0)

我没有看到这一点,为什么这是一个sql问题。但是如果你想要SourceLevel 1(我现在称之为SL1),那么只有你还没有SL2或SL3 ......

你为什么不尝试这个:

SL2或SL3或(不是SL2而不是SL3和SL1)