web-dev-qa-db-ja.com

アクセスで完全な外部結合クエリを記述する方法

元のクエリ:

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"基準を処理していませんか?

26
user2924488

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ではありません。

31
Paul Draper

より効率的で高速なコード:

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
8
user6012447

フィールド名が両方のテーブルで同じ場合、*演算子を使用するのではなく、個別にリストする必要があることがわかりました。また、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;
1
Casey35