2014-10-29 30 views
0

我期待UNION兩個SELECT語句,但它使第二選擇排除一些結果,如果第一選擇含有某些記錄,而無需使用臨時表T-SQL Union,但不使用臨時表而排除基於另一個表的結果?

我想實現這樣的事情:

select customernumber, name into #tempCustomer1 from customers1 

select customernumber, name from #tempCustomer1 
UNION 
select customernumber, name from customers2 
where customernumber not in (select customernumber from #tempCustomer1) 

order by customernumber 

沒有臨時表可以做到這一點嗎?

回答

1

您的查詢與UNION應該完全一致,因爲Union會丟棄結果集中的重複行。所以,你只能說

select customernumber, name from customers1 

UNION 

select customernumber, name from customers2 

根據您的意見,您可以使用在線查詢來實現相同的,而無需使用臨時表像

SELECT * FROM 
(
select customernumber, name from customers1 

UNION 

select customernumber, name from customers2 
) tab 
WHERE customernumber NOT IN (select customernumber from customers1) 
ORDER BY customernumber 
+0

如果什麼CUSTOMERNUMBER和名稱的組合是不同的。例如,在表1中,我的客戶編號爲1,名稱爲'john',但在表2中,我的客戶編號爲1,名稱爲'johnny'。我希望能夠從表2中濾除'johnny'記錄。 – dtc 2014-10-29 23:38:12

+0

這是一種自定義過濾,在這種情況下,您應該做正在做的事情。稍微修改一下你的查詢,看看編輯的答案。 – Rahul 2014-10-29 23:39:59

2

這是一個有點不清楚你想要的最終結果是什麼,但要回答你的問題是否有可能做到這一點沒有臨時表?是的 - 你可以這樣做:

select customernumber, name from customers1 
UNION 
(
select customernumber, name from customers2 
where customernumber not in (select customernumber from customers1) 
) 
order by customernumber 

這將返回從customers1和customers2從customers2刪除customer1表ID的行由一組,我想這是你想要的。

如果你想擺脫重複的行,這是由UNION完成,因爲你沒有添加ALL選項。

有了這個測試設置:

declare @customers1 table (customernumber int, name char) 
declare @customers2 table (customernumber int, name char) 

insert @customers1 values (1,'a'),(2,'b') 
insert @customers2 values (3,'d'),(4,'e'),(1,'f') 

select customernumber, name from @customers1 
UNION 
(
select customernumber, name from @customers2 
where customernumber not in (select customernumber from @customers1) 
) 
order by customernumber 

輸出將是:

customernumber name 
1 a 
2 b 
3 d 
4 e 
相關問題