SQL结合了Union和Except

时间:2009-07-08 15:56:54

标签: sql sql-server

我想结合两个子查询的结果(比如SUB1和SUB2)。子查询有多个列,包括ID列。

如果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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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)

答案 2 :(得分:0)

您可以按ID进行分组。

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

答案 3 :(得分:0)

完全外部加入和ISNULL怎么样?

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