2009-12-11 101 views
10

我試圖使用聯合來獲取跨兩個表的所有不同的值。跨2個聯合sql服務器表獲取不同的值

這個想法是獲得columnA列中所有唯一值的計數而不重複,以便我可以獲得包含唯一columnA的所有列的總和。

這是我試過(SQL Server Express的2008年)

select 
    count(Distinct ColumnA) 
from 
( 
    select Distinct ColumnA as ColumnA from tableX where x = y 
    union 
    select Distinct ColumnA as ColumnA from tableY where y=z 
) 
+2

的,什麼是不完全的工作?你有一些多餘的DISTINCT,但否則這應該工作。 – 2009-12-11 21:45:27

+0

你到目前爲止得到了什麼,導致你相信你有什麼不正確? – 2009-12-11 21:46:47

回答

17
SELECT COUNT(distinct tmp.ColumnA) FROM ((SELECT ColumnA FROM TableX WHERE x=y) 
UNION (SELECT ColumnA FROM TableY WHERE y=z)) as tmp 

上的TableX和TableY額外distincts是不必要的;他們會在tmp.ColumnA子句中被剝離。聲明一個臨時表應該消除可能阻止查詢執行的含糊性。

+8

COUNT中的DISTINCT(DISTINCT沒有必要,因爲'UNION'刪除了重複項 – 2009-12-11 21:45:46

+0

這對我很有用,我只需在union'd select語句的末尾添加ColumnA即可 – rockit 2009-12-11 21:49:15

+0

@OMG:Good call。Thanks for – 2009-12-11 21:49:21

10
SELECT COUNT(*) 
FROM 
(
SELECT DISTINCT ColumnA From TableX WHERE x = y 
UNION 
SELECT DISTINCT ColumnA From TableY WHERE y = z 
) t 

使用「UNION」不會返回重複項。如果您使用了「UNION ALL」,那麼將會返回每個表中重複的ColumnA值。

+2

DISTINCT不是必須的,因爲UNION會刪除重複項。'UNION ALL'不會**刪除重複項 – 2009-12-11 21:46:40

+0

正確 - 我只是認爲包括可能存在的獨特內容更多的性能(執行計劃是不同的) - 需要更多的測試來證明/反駁這個。Re:UNION ALL,這就是我說的:) – AdaTheDev 2009-12-11 21:52:45

0

要獲得在歐盟不同的值查詢,你可以試試這個

Select distinct AUnion.Name,AUnion.Company from (SELECT Name,Company from table1 UNION SELECT Name,Company from table2)AUnion 
1
SELECT DISTINCT Id, Name 
FROM TableA 
UNION ALL 
SELECT DISTINCT Id, Name 
FROM TableB 
WHERE TableB.Id NOT IN (SELECT Id FROM TableA) 
+0

請在代碼中添加一些註釋 – Observer 2017-11-07 18:54:18