私は2つのテーブルAとBを持っています。どちらも同じ構造です。これら 2 つの間に一致するレコードが見つかります。ここにスクリプトがあります
CREATE TABLE HRS.A
(
F_1 NUMBER(5,0),
F_2 NUMBER(5,0),
F_3 NUMBER(5,0)
);
CREATE TABLE HRS.B
(
F_1 NUMBER(5,0),
F_2 NUMBER(5,0),
F_3 NUMBER(5,0)
);
INSERT INTO hrs.a VALUES (1,1000,2000);
INSERT INTO hrs.a VALUES (2,1100,8000);
INSERT INTO hrs.a VALUES (3,4000,3000);
INSERT INTO hrs.a VALUES (4,2000,5000);
INSERT INTO hrs.a VALUES (5,5000,3000);
INSERT INTO hrs.a VALUES (6,6000,6000);
INSERT INTO hrs.a VALUES (7,3000,7000);
INSERT INTO hrs.a VALUES (8,1100,9000);
INSERT INTO hrs.b VALUES (1,4000,2000);
INSERT INTO hrs.b VALUES (2,6000,8000);
INSERT INTO hrs.b VALUES (3,1000,3000);
INSERT INTO hrs.b VALUES (4,2000,5000);
INSERT INTO hrs.b VALUES (5,8000,3000);
INSERT INTO hrs.b VALUES (6,1100,6000);
INSERT INTO hrs.b VALUES (7,5000,7000);
INSERT INTO hrs.b VALUES (8,1000,9000);
一致するレコードを検索するには
SELECT a.F_1 A_F1, b.F_1 B_F1 FROM HRS.A, HRS.B WHERE A.F_2 = B.F_2
結果
A_F1 B_F1
3 1
6 2
1 3
4 4
8 6
2 6
5 7
1 8
ここで、両方の列の重複するエントリを個別に削除したいです。たとえば、A_F1 で 1 が繰り返されているため (B_F1 に関係なく)、行 # 3(1-3) と 8(1-8) が削除されます。現在、B_F1 で 6 が繰り返されているため (A_F1 に関係なく)、行 # 5(8-6) と 6(2-6) が削除されます。最終結果は
A_F1 B_F1
3 1
6 2
4 4
5 7
ここで最も重要な部分は、これら 2 つのテーブルにそれぞれ 500,000 レコードが含まれていることです。最初にこれらの一致するレコードを見つけて一時テーブルに挿入し、次に最初の列から重複を削除し、次に2番目の列から重複を削除してから、一時テーブルからすべてを選択しました。これは遅すぎます。どうすればこれをできるだけ早く達成できますか?
編集#1
次のステートメントを複数回実行して、各テーブルに 4096 レコードを生成しました
INSERT INTO hrs.a SELECT F_1 + 1, F_2 + 1, 0 FROM hrs.a;
INSERT INTO hrs.b SELECT F_1 + 1, F_2 + 1, 0 FROM hrs.b;
今、私はすべての答えを実行し、これらを見つけました
Rachcha 9.11 secs OK
techdo 1.14 secs OK
Gentlezerg 577 msecs WRONG RESULTS
Justin 218 msecs OK
@Justin でさえ、それぞれの 65,536 レコードに 37.69 秒かかりました (合計 = 131,072)
実際のレコード数は1,000,000であるため、より最適化された回答を待っています:)
ジャスティンの回答に基づくクエリの実行計画は次のとおりです