1

我正在尝试弄清楚 SQL 查询是如何运行的,并且遇到了一些绊脚石。

如果使用类似于以下的 where 子句:

A 或 B 和 C

这可能意味着以下任何一种

(A 或 B)和 C

或者

一个或(B 和 C)

在大多数情况下,结果是相同的,但如果要查询的集合仅包含 {A},则第一个变体将返回空结果集,而第二个变体将返回 {A}。SQL 实际上返回 1 结果。

有谁知道(或有链接)任何可以帮助我了解查询是如何构建的见解?

番茄酱

4

4 回答 4

2

AND在优先级高于的知识(来自文档)中OR,您应该旨在以WHERE合取范式(“a seires of ANDclauses”)为从句编写谓词。

如果意图是

( 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 )
于 2012-04-20T10:59:12.733 回答
2

根据MSDN的顺序如下:

  1. ~(按位非)

  2. (*) (乘), / (除), % (模)

  3. (+) (正)​​, - (负), + (加), (+ 连接), - (减), & (按位与), ^ (按位异或), | (按位或)

  4. =、>、<、>=、<=、<>、!=、!>、!<(比较运算符)

  5. 不是

  6. 所有,任何,之间,在,喜欢,或,一些

  7. =(作业)

于 2012-04-20T10:16:59.703 回答
0

AND并且OR有不同的先例。

请参阅优先级

于 2012-04-20T10:17:21.403 回答
0

对于 SQL-Server(这是您的标签),这里是优先级http://msdn.microsoft.com/en-us/library/ms190276.aspx但是.. 如果您担心给出的确切结果集,您确实应该开始使用 () 子集。

于 2012-04-20T10:17:32.770 回答