2 つのテーブル (tbl1 と tbl2) を結合しています。左結合は、tbl2 または tbl1 のみにある tbl1 からのすべてのデータを提供します。右結合は、tbl1 に存在しない tbl2 からのデータを提供します。
両方の結果を組み合わせたい。
tbl1 と tbl2 からすべてのデータを取得するには、これを行う最善の方法は何ですか?
それを行うことができるのは、を使用することだけですUNION
。FULL JOIN
MySQL は、MSSQL のようにサポートしていません。
SELECT *
FROM tbl1 t1
LEFT JOIN tbl2 t2
ON t1.col = t2.col
UNION
SELECT *
FROM tbl1 t1
RIGHT JOIN tbl2 t2
ON t1.col>= t2.<col
こちらをご覧ください: MYSQL での FULL JOIN のシミュレート
ちなみに、 にUNION
はオプションのキーワードALL
があり、ALL
を省略すると、結果セットからUNION
自動的にDISTINCT
行が選択されます。
例:
SELECT *
FROM tableA
UNION ALL
SELECT *
FROM tableA
これにより、行が重複する可能性があります
ColA ColB
==================
1 John
2 Jade
2 Jade
3 Hello
しかし、単語を省略した場合ALL
SELECT *
FROM tableA
UNION
SELECT *
FROM tableA
これにより、個別の行のみが生成される可能性があります
ColA ColB
==================
1 John
2 Jade
3 Hello
あなたが欲しいのはFULL JOIN
LEFT JOIN
+RIGHT JOIN
=FULL JOIN
だからこれを試してみてください:
SELECT * FROM tbl1
LEFT JOIN tbl2 ON tbl1.id = tbl2.id
UNION
SELECT * FROM tbl1
RIGHT JOIN tbl2 ON tbl1.id = tbl2.id
このUNION
句は、2つのSQLクエリの結果を、一致するすべての行の1つのテーブルに結合します。
3 つ以上のテーブルの完全結合がある場合に簡単に拡張できる別の方法を次に示します。
SELECT t1*, t2.*
FROM
( SELECT col
FROM tbl1
UNION
SELECT col
FROM tbl2
) AS d
LEFT JOIN tbl1 AS t1
ON t1.col = d.col
LEFT JOIN tbl2 AS t2
ON t2.col = d.col ;
FULL OUTER JOINを使用する必要がありますが、mysqlはそれをサポートしていません。結果を得るためにこれを行うことができます。
SELECT *
FROM tbl1 t1 LEFT JOIN tbl2 t2
ON t1.<col> = t2.<col>
UNION
SELECT *
FROM tbl1 t1 RIGHT JOIN tbl2 t2
ON t1.<col>= t2.<col>