我正在尝试弄清楚 SQL 查询是如何运行的,并且遇到了一些绊脚石。
如果使用类似于以下的 where 子句:
A 或 B 和 C
这可能意味着以下任何一种
(A 或 B)和 C
或者
一个或(B 和 C)
在大多数情况下,结果是相同的,但如果要查询的集合仅包含 {A},则第一个变体将返回空结果集,而第二个变体将返回 {A}。SQL 实际上返回 1 结果。
有谁知道(或有链接)任何可以帮助我了解查询是如何构建的见解?
番茄酱
我正在尝试弄清楚 SQL 查询是如何运行的,并且遇到了一些绊脚石。
如果使用类似于以下的 where 子句:
A 或 B 和 C
这可能意味着以下任何一种
(A 或 B)和 C
或者
一个或(B 和 C)
在大多数情况下,结果是相同的,但如果要查询的集合仅包含 {A},则第一个变体将返回空结果集,而第二个变体将返回 {A}。SQL 实际上返回 1 结果。
有谁知道(或有链接)任何可以帮助我了解查询是如何构建的见解?
番茄酱
AND
在优先级高于的知识(来自文档)中OR
,您应该旨在以WHERE
合取范式(“a seires of AND
clauses”)为从句编写谓词。
如果意图是
( A OR B ) AND C
然后这样写,一切都很好。
但是,如果意图是
A OR ( B AND C )
那么我建议你应用导致合取范式的分配重写法则,即
( P AND Q ) OR R <=> ( P OR R ) AND ( Q OR R )
在你的情况下:
A OR ( B AND C ) <=> ( A OR B ) AND ( A OR C )
根据MSDN的顺序如下:
~(按位非)
(*) (乘), / (除), % (模)
(+) (正), - (负), + (加), (+ 连接), - (减), & (按位与), ^ (按位异或), | (按位或)
=、>、<、>=、<=、<>、!=、!>、!<(比较运算符)
不是
和
所有,任何,之间,在,喜欢,或,一些
=(作业)
AND
并且OR
有不同的先例。
请参阅优先级
对于 SQL-Server(这是您的标签),这里是优先级http://msdn.microsoft.com/en-us/library/ms190276.aspx但是.. 如果您担心给出的确切结果集,您确实应该开始使用 () 子集。