2009-07-08 78 views
3

我想聯合兩個子查詢(比如SUB1和SUB2)的結果。子查詢具有多列,包括ID列。SQL組合聯盟和不包括

如果在SUB1中存在ID = 1,我希望聯合結果只包括來自SUB1的ID = 1的行,而不包括來自SUB2的ID = 1的行。

例如。如果SUB1有以下列和行

ID | Date 
1 | 7/1 
2 | 7/3 

而且SUB2有以下幾點:

ID | Date 
1 | 7/4 
3 | 7/8 

我想聯合的結果是

ID | Date 
1 | 7/1 
2 | 7/3 
3 | 7/8 

我能想到的唯一辦法在做這樣的事情

SELECT * FROM (SUB1) 

UNION 

SELECT * FROM (SUB2) 
WHERE ID NOT IN 
(SELECT ID FROM (SUB1)) 

我唯一擔心的是SUB1和SUB2是長查詢。我想避免在查詢中粘貼SUB1兩次。

有沒有更簡潔的方法?謝謝

回答

4
SELECT COALESCE(sub1.id, sub2.id), COALESCE(sub1.date, sub2.date) 
FROM sub1 
FULL OUTER JOIN 
     sub2 
ON  sub1.id = sub2.id 
+0

謝謝,這個工程。 – David 2009-07-08 17:40:06

0

你可以按ID分組。

SELECT ID, MAX(Date) FROM (SUB1) 
UNION 
SELECT ID, MAX(Date) FROM (SUB2) 
GROUP BY ID 
4

如果使用SQL Server 2005或更高,公用表表達式將有助於不會打字了兩次代碼:

; with CTE_Sub1 as (select * from (Sub1)) 
select * from CTE_Sub1 
union 
select * from (sub2) 
where ID not in (select id from CTE_Sub1) 
+0

我正在使用的服務器是SQL Server 2000,但這也是一件好事。謝謝你的幫助。 – David 2009-07-08 17:41:06

0

怎麼樣一個FULL OUTER JOIN和ISNULL?

SELECT 
    ISNULL(SUB1.ID, SUB2.ID), 
    ISNULL(SUB1.[Date], SUB2.[Date]) 
FROM 
    SUB1 
FULL OUTER JOIN 
    SUB2 
ON 
    SUB1.ID = SUB2.ID