SQL结合Union和Except

4

我想要联合两个子查询的结果(假设为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个回答

4
SELECT  COALESCE(sub1.id, sub2.id), COALESCE(sub1.date, sub2.date)
FROM    sub1
FULL OUTER JOIN
        sub2
ON      sub1.id = sub2.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)

我正在使用的服务器是SQL Server 2000,但这也是一个好东西要知道。谢谢你的帮助。 - David

0

你可以按照ID进行分组。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接