从两个表中获取数据,其中数据不适用于此表

时间:2013-05-15 10:07:58

标签: sql postgresql

我有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

5 个答案:

答案 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)

EXCEPTUNION的组合也可以解决问题。

我不知道这是否比其他解决方案更有效:

(
  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    ║
╚══════╝

See this SQLFiddle

答案 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