我有2张桌子
表 jt1
name
---
A
B
C
和TABLE jt2
name
---
B
C
D
我需要从两个表中获取名称,这两个表都不常见,结果必须是
result
------
A
D
这是我的查询,但可能有更好的解决方案吗?
SELECT jt1.name AS name FROM jt1
LEFT JOIN jt2
ON jt1.name = jt2.name
WHERE jt2.name IS NULL
UNION
SELECT jt2.name AS name FROM jt2
LEFT JOIN jt1
ON jt2.name = jt1.name
WHERE jt1.name IS NULL
答案 0 :(得分:2)
SELECT COALESCE(jt1.name, jt2.name) AS zname
FROM jt1
FULL JOIN jt2 ON jt1.name = jt2.name
WHERE jt2.name IS NULL OR jt1.name IS NULL
;
BTW:天真的解决方案可能会更快:
SELECT name
FROM a (WHERE NOT EXISTS SELECT 1
FROM b WHERE b.name = a.name)
UNION ALL
SELECT name
FROM b (WHERE NOT EXISTS SELECT 1
FROM a WHERE a.name = b.name)
;
BTW:我故意在这里使用UNION ALL
,因为我知道两个 leg 不能有任何重叠,并且可以省略删除重复项。
答案 1 :(得分:1)
EXCEPT
和UNION
的组合也可以解决问题。
我不知道这是否比其他解决方案更有效:
(
SELECT name
FROM jt1
EXCEPT
SELECT name
FROM jt2
)
UNION
(
SELECT name
FROM jt2
EXCEPT
SELECT name
FROM jt1
)
ORDER BY Name;
(paranthesises不是真的有必要,我只是添加它们来形象化方法)
答案 2 :(得分:0)
你可以按照
的方式做点什么select * from jt where jt.name not in (select name from jt2)
union
select * from jt2 where jt2.name not in (select name from jt)
或者如果条目在每个表中只是单数,那么你可以进行计数和联合 或者你甚至可以设置一个完整的外连接(可能不是很快) 或者您可以设置游标和临时表来执行此操作
最终将取决于您的索引的设置方式以及所涉及的数据量以及确定哪个最佳的架构
可能值得尝试一些并自己剖析以找出
答案 3 :(得分:0)
您可以使用FULL JOIN
:
SELECT jt1.name
FROM jt1
FULL JOIN jt2
ON jt1.name = jt2.name
WHERE jt2.name IS NULL
UNION
SELECT jt2.name
FROM jt1
FULL JOIN jt2
ON jt1.name = jt2.name
WHERE jt1.name IS NULL
ORDER BY Name;
输出:
╔══════╗
║ NAME ║
╠══════╣
║ A ║
║ D ║
╚══════╝
答案 4 :(得分:0)
效率不高,但您可以使用exclude语句:
Select name from A
Union
Select name from B
Except
Select A.name from A join B on B.name = A.name
这个完整的连接也应该可以解决问题:
Select coalesce(a.name, b.name) as name
From a full join b on a.name = b.name
Where a.name is null or b.name is null