0

我有 2 张桌子

jt1

name
---
A
B
C

和表 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
4

5 回答 5

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
  ;

顺便说一句:天真的解决方案可能会更快:

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在这里使用,因为我知道两条不能有任何重叠,去除重复的可以省略。

于 2013-05-15T10:34:45.627 回答
1

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

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

(
  SELECT name 
  FROM jt1
  EXCEPT
  SELECT name 
  FROM jt2
)
UNION 
(
  SELECT name 
  FROM jt2
  EXCEPT
  SELECT name 
  FROM jt1
)  
ORDER BY Name;

(括号并不是真正必要的,我只是添加它们以可视化该方法)

于 2013-05-15T10:39:01.303 回答
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)

或者如果每个表中的条目只是单数,你可以做一个计数和一个联合,或者你甚至可以设置一个完全外连接的东西(可能不是很快),或者你可以设置一个游标和临时表来做到这一点

最终这将取决于您的索引是如何设置的、所涉及的数据量以及确定哪个是最好的架构

可能值得尝试一些并自己分析它们以找出答案

于 2013-05-15T10:17:55.623 回答
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    ║
╚══════╝

看到这个 SQLFiddle

于 2013-05-15T10:29:56.243 回答
0

效率不高,但您可以使用排除语句:

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
于 2013-05-15T10:31:27.457 回答