UNION两个表减去第二个表中ID的重复记录

时间:2015-07-31 06:16:04

标签: sql sql-server tsql

我有两张表如下:

表1

id    name  desc
----- ----- ---------
1     nd1   desc1
2     nd2   desc2
4     nd4   
7     nd7   desc7

表2

id    name  desc     
----- ----- ---------
3     nd3   desc3
4     nd4   desc17   
5     nd5   desc5    
6     nd6   desc6    
7     nd7            

我需要的是第一张表中的所有记录以及第二张表中的记录,表明他们的ID在第一张表中不存在。

我需要的数据如下:

结果

id    name  desc
----- ----- ---------
1     nd1   desc1
2     nd2   desc2
3     nd3   desc3
4     nd4   
5     nd5   desc5    
6     nd6   desc6    
7     nd7   desc7

目前我正在做以下事情:

SELECT
    id, name, desc FROM table1
UNION
SELECT
    id, name, desc FROM table2 
WHERE
  Id NOT IN (SELECT id FROM table1)

有更有效的方法吗?

4 个答案:

答案 0 :(得分:1)

这个怎么样:

假设Table1 PK上有id

SELECT
    id, name, [desc]
FROM Table1
UNION ALL
SELECT
    id, name, [desc]
FROM Table2 t2
WHERE
    NOT EXISTS(SELECT 1 FROM Table1 WHERE id = t2.id)

答案 1 :(得分:1)

根据实际查询计划,此查询比使用UNION的示例查询稍微有效。

select
    case when t1.id is not null then t1.id else t2.id end id,
    case when t1.id is not null then t1.name else t2.name end name,
    case when t1.id is not null then t1.[desc] else t2.[desc] end [desc]
from
    table1 t1
    full outer join
        table2 t2
        on
            t1.id = t2.id

我还没有在大型数据集上测试它,所以我不知道接下来会发生什么。这是完整的小提琴:http://sqlfiddle.com/#!6/bb95d/1

答案 2 :(得分:0)

使用EXCEPT之类的UNION。但是,它不允许显示已存在于第一个查询中的行。

SELECT * FROM TABLE1
EXCEPT
SELECT * FROM TABLE2

答案 3 :(得分:0)

我有点怀疑这是更好的但我相信它的结果是等价的:

SELECT
    coalesce(t1.id, t2.id) as id, coalesce(t1.name, t2.name) as name,
    case when t1.id is not null then t1."desc" else t2."desc" end as "desc"
FROM
    table1 as t1 FULL OUTER JOIN table2 as t2 on t2.id = t1.id