SQL如何模拟xor?

jay*_*jay 7 sql

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

table1                 table2
------------           -------------
id | name              id | name
------------           -------------
 1 | alpha              1 | alpha
 3 | charlie            3 | charlie
 4 | delta              5 | echo
 8 | hotel              7 | golf
 9 | india
Run Code Online (Sandbox Code Playgroud)

现在的问题是写一个SQL查询将返回所有在任的行table1table2而不是两个,即:

result
------------
id | name
------------
 4 | delta
 5 | echo
 7 | golf
 8 | hotel
 9 | india
Run Code Online (Sandbox Code Playgroud)

我以为我可以做一些完全外连接:

SELECT table1.*, table2.* 
FROM table1 FULL OUTER JOIN table2 
ON table1.id=table2.id 
WHERE table1.id IS NULL or table2.id IS NULL
Run Code Online (Sandbox Code Playgroud)

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

red*_*ent 12

好吧,你可以用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
Run Code Online (Sandbox Code Playgroud)

这是我知道的一个小技巧:不等于和XOR一样,所以你可以让你的WHERE子句像这样:

WHERE ( table1.id IS NULL ) != ( table2.id IS NULL )
Run Code Online (Sandbox Code Playgroud)


Joe*_*nos 6

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


Loz*_*ace 5

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
Run Code Online (Sandbox Code Playgroud)