为什么OR语句给出了我不想要的记录?

dot*_*00b 1 sql t-sql sql-server sql-server-2005

这个查询:

select dept, job
from organizations
where (dept = 'Marketing' and job <> 'Sam Wise')
or    (dept = 'Marketing' and job <> 'The Precious')
Run Code Online (Sandbox Code Playgroud)

保留给予记录的工作显示'The Precious'的时候不应该.但是如果我以这种方式编写查询:

select dept, job
from organizations
where (dept = 'Marketing' and job <> 'Sam Wise')
and   (dept = 'Marketing' and job <> 'The Precious')
Run Code Online (Sandbox Code Playgroud)

然后我得到了正确的记录.没有'Sam Wise'或'The Precious'的工作.所以我想知道我对T-SQL中的AND和OR的理解是否混淆或者我的sql服务器是不是很糟糕.

简而言之,为什么第一个查询不会删除所有将"Sam Wise"或"The Precious"作为作业的记录,但第二个查询是?

Eri*_*ikE 14

那是因为如果发现任何一个括号OR子句为真,则包含该行.你的两个条件ORed在逻辑上意味着所有行的并集,其中作业不是'Sam Wise'或NOT'The Precious'.并且所有行都符合这些标准,因为例如'Sam Wise'不是'The Precious',因此满足第二个条件.

这是我认为你想要的:

select dept, job
from organizations
where
   dept = 'Marketing'
   and not (
      job = 'Sam Wise'
      or job = 'The Precious'
   )
Run Code Online (Sandbox Code Playgroud)

请注意,您可以简单地使用AND:

select dept, job
from organizations
where
   dept = 'Marketing'
   and job <> 'Sam Wise'
   and job <> 'The Precious'
Run Code Online (Sandbox Code Playgroud)

这是逻辑定律的一个很好的例子.要表示相同的条件(A = X OR B = Y)但是表示消极(你想要一个NOT在前面),它总是转换为NOT (A <> X AND B <> Y).它与(A = X AND B = Y)=> 的作用相同NOT (A <> X OR B <> Y).在你的情况下,A并且B是相同的,所以你的查询条件job是等价的NOT (A = X AND A = Y),有些人认为这将显示你将永远返回true,因为A = X AND A = Y永远不会是真的.

由于IN()可以用来一起表达许多OR条件,你可以用这种方式简化查询:(虽然不是引擎必须做的工作,但这是相同的).

select dept, job
from organizations
where
   dept = 'Marketing'
   and job not in ('Sam Wise', 'The Precious')
Run Code Online (Sandbox Code Playgroud)

稍后我意识到,A = X=> 的翻译A <> X只是否定,在单词的特殊查询意义上.在最简单的形式中,逻辑定律就是这样,给出了两个命题P1和P2:

  • NOT (P1 AND P2) => (NOT P1 OR NOT P2)
  • NOT (P1 OR P2) => (NOT P1 AND NOT P2)

请注意,这些也适用:

  • (P1 AND P2) => NOT (NOT P1 OR NOT P2)
  • (P1 OR P2) => NOT (NOT P1 AND NOT P2)

这些转换也非常有用.


Aar*_*and 9

这两个条款是独立考虑的.也许试试:

WHERE dept = 'Marketing' AND job NOT IN ('Sam Wise', 'The Precious');
Run Code Online (Sandbox Code Playgroud)