2011-10-27 76 views
0

SQL Server 2008中聯合選擇語句的結果包括在任何源表中找不到的記錄。示例:SQL Server 2008聯合選擇'創建'不存在的記錄

theid是每個源表中的整數ID值。無論是表包括277741.

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

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

theid值但是,當您運行下面的聯盟Select語句,爲theid產生的記錄。

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從斷開連接的父表中獲取不相關的記錄(源數據都是使用Select..Into語句從同一父節點進行的,並且沒有任何外鍵關係到任何一個表回到父節點)?

+0

請提供一個顯示您的問題的repro腳本。 –

+0

已經提供的腳本中缺少的內容需要什麼? –

+0

注意UNION消除重複的,所以您的查詢 選擇* 進入ConjoinedData 從DataTable1 聯盟 選擇* 從DataTable2 凡theid不在(選擇theid從DataTable1) 應該只是 選擇* 進入ConjoinedData 來自DataTable1 Union 選擇* 來自DataTable2 是「theid」唯一嗎?它是一個int嗎? –

回答

1

277741不同於27741。以下腳本完全描述了您所描述的內容:

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; 
+0

值27741是一個錯字。返回創建記錄的Ther ID是277741.請注意,該記錄存在於父項中,但不屬於任何一個子項,並且該聯合僅用於連接子表。該連接的結果仍然是父項的一個子集。 –

+0

然後解決你的問題。另外,請提供* exact *表定義。 –

相關問題