MS ACCESS SQL で次のシナリオに直面しています。(接続の問題により SQLFiddle を読み込めません)
Table A :
ID, Code 1, Code 2, Source, Other Columns
10, A20, AA, x, etc
10, A50, AA, x, etc
10, A70, AA, x, etc
10, E20, EE, x, etc
20, A25, AA, x, etc
Table B :
ID, Code 1, Code 2, Source, Other Columns
10, A20, AA, y, etc
10, A50, AA, y, etc
20, B50, BB, y, etc
30, E20, EE, y, etc
40, A25, AA, y, etc
1. 両方のテーブルに一致するレコードがあります。
10, A20, AA, x, y, etc
10, A50, AA, x, y, etc
2. 両方のテーブルに一致しないレコードがあります。
10, A70, AA, x, etc
10, E20, EE, x, etc
20, A25, AA, x, etc
20, B50, BB, y, etc
30, E20, EE, y, etc
40, A25, AA, y, etc
最初の内部クエリ:
Table A and B on ID, Code 1, Code 2, GROUP BY
重複を避けるため、間に INNER JOIN を使用します。新しいテーブル C を選択します
2 番目のクエリ:
NOT EXISTS クエリを実行し、一致するセットで見つからないレコードを除外しますTable A
。Table C on ID, Code 1, Code 2
3 番目のクエリ:
NOT EXISTS クエリを実行し、一致するセットで見つからないレコードを除外しますTable B
。Table C on ID, Code 1, Code 2
SELECT T1.ID, T1.CODE1, T1.CODE2, T1.SOURCE, T1.OTHERCOLUMNS
FROM TABLE_A AS T1
WHERE NOT EXISTS(SELECT DISTINCT T2.ID FROM TABLE_C AS T2
WHERE T2.ID = T1.ID AND T2.CODE1 = T1.CODE1
AND T2.CODE2 = T1.CODE2)
GROUP BY T1.ID, T1.CODE1, T1.CODE2, T1.SOURCE, T1.OTHERCOLUMNS;
最後に、これら 3 つのクエリの結果は、新しいテーブル D に UNION されます。これは、さらに更新するために他のテーブルと結合する必要があります。
理想的には、一意の一致するレコードと一致しないレコードが 1 つのテーブルにある必要があります。各テーブルには 30,000 を超えるレコードがあります。現在INNER JOIN
、一致するレコードの検索を使用しています。次に、別の 2 つの個別の NOT EXISTS クエリを使用して、一致しないレコードを取得します。LEFT JOIN + NULL および DELETE クエリにかかる時間を比較した後、これは私が思いつくことができる最も合理的なものです。それでも、最後の 2 つのクエリにはそれぞれ 5 分以上かかります。それはまったく耐えられません。
だから私は、私たちの SQL グルの何人かがこのケースに光を当ててくれることを望んでいました...効率的な (より高速な) ソリューションのために。さらに、これは非常に強引な方法であり、何かが欠けていると確信しています。