OR语句SQL的优先级

Bob*_*t88 4 sql sql-server-2008

我有以下代码段:

WHERE (Person.WorkGroupId = 2 or Person.RoleId = 2)
Run Code Online (Sandbox Code Playgroud)

我想要发生的是WorkGroupId在Person表上返回第一个出现的2.但是,如果没有a的人为WorkgroupId2,则RoldId在Person表中选择第一个出现2的人.

谢谢

Lam*_*mak 12

SELECT TOP (1) * FROM 
(
  SELECT TOP (1) *, o = 1
  FROM Person
  WHERE WorkGroupId = 2 

  UNION ALL

  SELECT TOP (1) *, o = 2
  FROM Person 
  AND RoleId = 2
) AS x ORDER BY o;
Run Code Online (Sandbox Code Playgroud)

  • @Nir好的,这是dbo.Person有1,258,600行的结果.[Lamak的计划](http://i.stack.imgur.com/b6trx.png),[您的计划](http://i.stack.imgur.com/Xxu4H.png).Lamak仍然在持续时间上获胜,CPU,读取.[当我使用'MAXDOP 1`来消除查询中的并行性时也是如此](http://i.stack.imgur.com/z25z1.png).这就是为什么假设和一揽子陈述是坏的,非常糟糕的原因. (6认同)
  • @nir不是很有趣,[当你的`sort`操作比Lamak的三个聚簇索引扫描更昂贵?(该表只有~2,100行,但仍然.)](http://i.stack.imgur.com/yGf1m.png) (5认同)
  • @NirKornfeld一切都取决于搜索条件和基线数据量.大(?)表上的表扫描(通常)比返回相同行数的索引更好.因此,当实际拥有该信息时,讨论计划,IO和实际数据是可以的. (3认同)
  • @Nir [当然,你的计划更简单,但指标不是谎言.Lamak的解决方案使用更少的CPU,更少的I/O,并且更快地完成.再一次,一揽子陈述,永远不要说永远,等等.](http://i.stack.imgur.com/7DJod.png)显然,分类可能比你想象的贵很多. (3认同)
  • @AaronBertrand是的,我们是.我想在那种情况下,也许Lamak的答案应该是被接受的答案,而不是我的答案. (3认同)

Nir*_*eld 7

如果你只使用那个,你会得到多个记录.

我会这样做:(有问题的表只扫描一次)

Select top 1 *
From dbo.SomeTable
where WorkGroupId=2 or RoleId=2
Order by case 
   when WorkGroupId=2 then 1 
   when RoleId=2 then 2 
end
Run Code Online (Sandbox Code Playgroud)

  • 很抱歉,虽然这个查询更漂亮,[Lamak的回答](http://stackoverflow.com/a/18218741/61305)实际上表现更好 - 当然不知道有关用户表的更多信息,而且还有针对行计数范围的表从2000年到126万 - 正如我们在下面的评论中所证明的那样. (4认同)