9

我想知道是否有人可以帮助我解决我在求职面试中遇到的这个问题。假设我有两个表,例如:

table1                 table2
------------           -------------
id | name              id | name
------------           -------------
 1 | alpha              1 | alpha
 3 | charlie            3 | charlie
 4 | delta              5 | echo
 8 | hotel              7 | golf
 9 | india

问题是编写一个 SQL 查询,该查询将返回其中一个table1table2两个中的所有行,即:

result
------------
id | name
------------
 4 | delta
 5 | echo
 7 | golf
 8 | hotel
 9 | india

我想我可以做一个完整的外部连接:

SELECT table1.*, table2.* 
FROM table1 FULL OUTER JOIN table2 
ON table1.id=table2.id 
WHERE table1.id IS NULL or table2.id IS NULL

但这给了我 SQL Fiddle 的语法错误(我认为它不支持FULL OUTER JOIN语法)。除此之外,我什至想不出一种方法来连接两个表的行,更不用说过滤掉两个表中出现的行了。有人可以启发我并告诉我该怎么做吗?谢谢。

4

5 回答 5

14

好吧,您可以使用UNION而不是OUTER JOIN.

SELECT * FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
UNION
SELECT * FROM table1 t1
RIGHT JOIN table2 t2 ON t1.id = t2.id

这是我知道的一个小技巧:not equals与 XOR 相同,因此您的WHERE子句可以是这样的:

WHERE ( table1.id IS NULL ) != ( table2.id IS NULL )
于 2013-08-08T20:50:14.180 回答
6
select id,name--,COUNT(*)
from(
select id,name from table1 
union all 
select id,name from table2
) x
group by id,name
having COUNT(*)=1
于 2013-08-09T06:42:29.327 回答
6

我确信有很多解决方案,但我首先想到的是union all两个表,然后按名称分组,使用计数子句过滤having

于 2013-08-08T20:44:56.007 回答
3
(
SELECT * FROM TABLE1
EXCEPT
SELECT * FROM TABLE2
)
UNION ALL
(
SELECT * FROM TABLE2
EXCEPT
SELECT * FROM TABLE1
)
于 2013-08-08T20:53:27.250 回答
0

这应该适用于大多数数据库服务器

SELECT id, name 
  FROM table1
 WHERE NOT EXISTS(SELECT NULL FROM table2 WHERE table1.id = table2.id AND table1.name = table2.name)
 UNION ALL
SELECT id, name 
  FROM table2
 WHERE NOT EXISTS(SELECT NULL FROM table1 WHERE table1.id = table2.id AND table1.name = table2.name)
于 2013-08-08T20:55:49.137 回答