下面的查询1返回正确的结果。但是为什么query2会返回错误的结果呢?看起来query2中的exists不能按预期工作。在SQL Server 2016上测试过。
create table #t1 (id nvarchar(20), typ nvarchar(20))
insert into #t1
values ('1', 'stu'), ('2', 'exstu'), ('string', null)
create table #t2 (id int)
insert into #t2
values (1), (3)
--
--select * from #t1
--select * from #t2
--drop table #t1
--drop table #t2
-- Query #1:
select *
from #t1
where #t1.typ = 'stu' or typ = 'exstu'
and exists (select * from #t2
where #t1.id = #t2.id)
-- Query #2:
select *
from #t1
where exists (select * from #t2
where #t1.id = #t2.id)
and #t1.typ = 'stu' or typ = 'exstu'
答案 0 :(得分:2)
AND优先,因此第二个查询中的最后一个条件typ = 'exstu'
导致结果集中包含其他行。请检查operator-precedence-transact-sql
答案 1 :(得分:1)
假设您希望两个查询都给出相同的结果,您需要在第二个查询的WHERE子句中添加括号以使布尔逻辑匹配:
select *
from #t1
where
exists (
select * from #t2
where #t1.id = #t2.id
)
and (#t1.typ = 'stu' or typ = 'exstu')