我对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。
答案 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)