我有两张表如下:
表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)
有更有效的方法吗?
答案 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