为什么这两种查询会得到不同的结果?

InFerNaL_LioN 2006-11-05 10:31:36
SQl Server的Northwind数据库下对Orders表和Customers表做左连接,对于以下两种查询方法
1. select *
from (select a.customerid x,b.orderid,b.customerid y
from Customers a,Orders b
where a.customerid*=b.customerid) c
where c.y is null

结果:
orderid x y
ALFKI NULL NULL
ANATR NULL NULL
ANTON NULL NULL
AROUT NULL NULL
BERGS NULL NULL
BLAUS NULL NULL
................... 共91行

2.select a.customerid x,b.orderid,b.customerid y
into #temp
from Customers a,Orders b
where a.customerid*=b.customerid

select * from #temp where y is null

结果:
orderid x y
PARIS NULL NULL
FISSA NULL NULL 共2行


我的目的是要检索出没下过定单的Customer,
请问这两种查询为什么会得到截然不同的结果?
...全文
265 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
InFerNaL_LioN 2006-12-20
  • 打赏
  • 举报
回复
那么为什么这两中方法也不一样?
1.
select a.customerID,b.orderid,b.customerid
from Customers a left join Orders b
on a.customerid=b.customerid
where b.customerid is null

结果为2行

-----------------------------------------
2.

select a.customerid x,b.orderid,b.customerid y
from Customers a left join Orders b
on a.customerid=b.customerid and b.customerid is null

结果为91行
中国风 2006-11-05
  • 打赏
  • 举报
回复
select a.customerid x,b.orderid,b.customerid y
--into #temp
from Customers a,Orders b
where a.customerid*=b.customerid and b.customerid is null

select a.customerid x,b.orderid,b.customerid y
-- into #temp
from Customers a left join Orders b
on a.customerid=b.customerid and b.customerid is null
以上两种方法生成的临时表结果都是91条记录
xnhncg 2006-11-05
  • 打赏
  • 举报
回复
在早期的 Microsoft® SQL Server™ 2000 版本中,使用 *= 和 =* 在 WHERE 子句中指定左、右外部联接条件。有时,该语法会导致有多种解释的不明确查询。FROM 子句中指定遵从 SQL-92 的外部联接,不会导致上述不确定性。因为 SQL-92 语法更为精确,所以,本版中未包括有关在 WHERE 子句中使用旧的 Transact-SQL 外部联接语法的详细信息。以后的 SQL Server 版本可能不再支持该语法。任何使用 Transact-SQL 外部联接的语句都应改为使用 SQL-92 语法。

如果改为这样:select *
from (select a.customerid x,b.orderid,b.customerid y
from Customers a left join Orders b
on a.customerid=b.customerid) c where c.y is null order by c.y

就和下一条语句的结果相同了
中国风 2006-11-05
  • 打赏
  • 举报
回复
select a.customerid x,b.orderid,b.customerid y
-- into #temp
from Customers a left join Orders b
on a.customerid=b.customerid and b.customerid is null
*=为左联
from Customers a,Orders b
where a.customerid*=b.customerid)
等同
from Customers a left join Orders b
on a.customerid=b.customerid and b.customerid is null
楼主再试试
中国风 2006-11-05
  • 打赏
  • 举报
回复
select * into #a
from (select a.customerid x,b.orderid,b.customerid y
from Customers a,Orders b
where a.customerid*=b.customerid) c
where c.y is null
select * from #a where y is null
测试正常91条
StarRains 2006-11-05
  • 打赏
  • 举报
回复
是挺神奇的
select count(*),y from (select a.customerid x,b.orderid,b.customerid y from Customers a,Orders b where a.customerid*=b.customerid) c
group by y

结果中y为Null的count是2
cnt y
----------- -----
2 NULL

而执行
select count(*),y from (select a.customerid x,b.orderid,b.customerid y from Customers a,Orders b where a.customerid*=b.customerid) c
group by y

结果:
cnt y
----------- -----
91 NULL

哪位老大能解释一下?

hhhdyj 2006-11-05
  • 打赏
  • 举报
回复
同意 xnhncg() ( )

34,872

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧