9

就職の面接で受けたこの質問を誰かが解決するのを手伝ってくれるかどうか疑問に思っています. 次のような 2 つのテーブルがあるとします。

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

table1問題は、どちらか一方またはtable2両方にあるすべての行を返す SQL クエリを作成することでした。つまり、次のようになります。

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ます)。それ以外では、2 つのテーブルの行を連結する方法を見つけることさえできません。ましてや、両方に表示される行を除外することはできません。誰かが私を啓発し、これを行う方法を教えてもらえますか? ありがとう。

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 equalsWHEREは XOR と同じなので、次のような句を持つことができます:

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 に答える
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 に答える