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)
这些转换也非常有用.
这两个条款是独立考虑的.也许试试:
WHERE dept = 'Marketing' AND job NOT IN ('Sam Wise', 'The Precious');
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
213 次 |
最近记录: |