SQL Server 2008 Union选择“创建”不存在的记录

时间:2011-10-27 22:55:09

标签: sql-server

SQL Server 2008中的union select语句的结果包括在任一源表中都找不到的记录。例如:

theid是每个源表中的整数ID值。两个表都没有包含277741的值。

Select *
From DataTable1
WHere theid = 277741
-- 0 records returned

Select *
From DataTable2
Where theid = 277741
-- 0 records returned

但是,当您运行下面的Union Select语句时,会为该id生成一条记录。

Select *
Into ConjoinedData
From DataTable1
Union
Select *
From DataTable2
Where theid Not In (Select theid From DataTable1)

Select 
From ConjoinedData
Where theid = 27741
-- 1 record returned

theid字段不是源表中的标识字段。最终,DataTable1和DataTable2的数据来自同一个父级,其内容包含ID为277741的无关记录。但是,它与任何源表上的任何其他表都没有外键关系。我尝试过更改为Union All查询但没有成功。我在两个源表中都创建了一个索引,并显示“已创建”记录。我已经多次删除并重新创建源表无济于事。为什么SQL Server从断开连接的父表中获取不相关的记录(源talbes都是使用Select..Into语句从同一父项创建的,并且没有外键关系到任何一个表回到父表)?

1 个答案:

答案 0 :(得分:1)

27774127741不同。以下脚本完全再现了您所描述的内容:

create table Table1 (id int);
create table Table2 (id int);
go

insert into Table1(id) values (277742);
insert into Table2(id) values (27741);
go


Select * From Table1 WHere id = 277741;
Select * From Table2 Where id = 277741;
go

Select *
Into ConjoinedData
From Table1
Union
Select *
From Table2
Where id Not In (Select id From Table1);

Select *
From ConjoinedData
Where id = 27741;