元のクエリ:
SELECT *
FROM AA
FULL OUTERJOIN BB on (AA.C_ID = BB.C_ID);
上記のクエリを変換して、Microsoft Accessと互換性を持たせるにはどうすればよいですか?
私は仮定しています:
SELECT *
FROM AA
FULL LEFT JOIN BB ON (AA.C_ID = BB.C_ID);
最初のクエリをAccessと互換性のあるクエリに正しく変換する前に、 "FULL"基準を処理していませんか?
AAとBBに重複する行がない(つまり、すべて同じ値)と仮定すると、完全外部結合は左結合と右結合の結合に相当します。
SELECT *
FROM AA
LEFT JOIN BB ON AA.C_ID = BB.C_ID
UNION
SELECT *
FROM AA
RIGHT JOIN BB ON AA.C_ID = BB.C_ID
重複する行がある場合(そしてそれらを保持したい場合)、WHERE AA.C_ID IS NULL
、またはAAからの対応するレコードがない場合にのみnullである他のフィールド。
編集:
同様のアプローチを参照してください here 。
より冗長ではあるが、よりパフォーマンスの高いものをお勧めします
SELECT *
FROM AA
JOIN BB ON AA.C_ID = BB.C_ID
UNION ALL
SELECT *
FROM AA
LEFT JOIN BB ON AA.C_ID = BB.C_ID
WHERE BB.C_ID IS NULL
UNION ALL
SELECT *
FROM AA
RIGHT JOIN BB ON AA.C_ID = BB.C_ID
WHERE AA.C_ID IS NULL
ただし、これはAA.C_ID
およびBB.C_ID
はnullではありません。
より効率的で高速なコード:
SELECT *
FROM AA
LEFT JOIN BB ON AA.C_ID = BB.C_ID
UNION ALL
SELECT *
FROM AA
RIGHT JOIN BB ON AA.C_ID = BB.C_ID
WHERE AA.C_ID IS NULL
フィールド名が両方のテーブルで同じ場合、*演算子を使用するのではなく、個別にリストする必要があることがわかりました。また、2番目のSELECTステートメントは他のテーブルを参照する必要があります。最初と同じSQLを使用し、それをRIGHT JOINに変更するだけでは、BBテーブルに行を含めることはできません。
SELECT AA.C_ID
FROM AA
LEFT JOIN BB ON
AA.C_ID = BB.C_ID
UNION ALL
SELECT BB.C_ID
FROM BB
LEFT JOIN AA ON
AA.C_ID = BB.C_ID
WHERE AA.C_ID IS NULL;