下面是一个简单的示例,它返回的结果很奇怪,这些结果是无法预测的,我们无法在团队中进行解释。我们是在做错什么还是SQL Server错误?
经过一番调查,我们将搜索范围缩小为子查询中的union子句,该子查询从“ men”表中选择一条记录
它可以在SQL Server 2000中正常工作(返回12行),但是在2008年和2012年,它仅返回一行。
create table dual (dummy int)
insert into dual values (0)
create table men (
man_id int,
wife_id int )
-- there are 12 men, 6 married
insert into men values (1, 1)
insert into men values (2, 2)
insert into men values (3, null)
insert into men values (4, null)
insert into men values (5, null)
insert into men values (6, 3)
insert into men values (7, 5)
insert into men values (8, 7)
insert into men values (9, null)
insert into men values (10, null)
insert into men values (11, null)
insert into men values (12, 9)
仅返回一行:1 1 2
select
man_id,
wife_id,
(select count( * ) from
(select dummy from dual
union select men.wife_id ) family_members
) as family_size
from men
--where wife_id = 2 -- uncomment me and try again
取消注释最后一行,它给出:2 2 2
有很多奇怪的行为:
- 在一系列放置,创建,截断和插入“ men”表之后,它有时仍然起作用(返回12行)
- 当将“ union select men.wife_id”更改为“ union all select men.wife_id”或“ union select isull(men.wife_id,null)”(!!!)时,它将返回12行(按预期)。
- 奇怪的行为似乎与“ wife_id”列的数据类型无关。我们在具有更大数据集的开发系统上观察到了它。
- “凡ifeid> 0”返回6行
- 我们还通过这种陈述观察到了视图的奇怪行为。SELECT *返回行的子集,SELECT TOP 1000返回全部