私はオラクル11gを使用しています。
関連するテーブルが 2 つあります。格納された値 (A) と挿入する新しい値 (B) です。どちらも 3 つの列 (クライアント、グループ、個人コード) の ID で関連付けられています。各テーブルには、他に約 20 の列があります (属性と呼びましょう)。
どの値が新しいか (ID は B にあり、ID は A にはない) を知ることができるように、それらを一致させる必要があるため、それらを A に挿入します。新しい値 (ID は A にありますが、B にはありません) であるため、保存されている値 (A) からそれらを削除します。
例えば:
A: クライアント | グループ | 個人コード | 名前 | 姓 _________________________________________________ 1 | 1 | 1 | ジョー | ジョー | 雌 1 | 1 | 2 | カール | ジョン 1 | 1 | 3 | ジョン | ジョン
B:
クライアント | グループ | 個人コード | 名前 | 姓 _________________________________________________ 1 | 1 | 1 | ジョー | ジョー | 雌 1 | 1 | 3 | ジョン | ジョン 1 | 1 | 4 | メアリー | 詐欺
この例では、人物 4 は新規で、人物 2 は削除する必要があり、1 と 3 は同じままです。
したがって、次の結果を返すクエリが必要です。
クライアント | グループ | 個人コード | アクション _________________________________________ 1 | 1 | 1 | 同等 1 | 1 | 2 | 削除する 1 | 1 | 3 | 同等 1 | 1 | 4 | 新着
私が作成したのは、次のクエリです。
WITH
A AS (
-- select from A table
),
B AS
(
-- select from B table
),
delete AS
(
-- select from A WHERE NOT EXISTS (B.id = A.ID)
),
news AS
(
-- select from B WHERE NOT EXISTS (A.id = B.ID)
),
eq AS
(
-- select A.* from A, B WHERE A.id = B.id AND A.attributes = B.attributes
)
select action.client, action.group, action.personcode, 'remove' from delete action
UNION ALL
select action.client, action.group, action.personcode, 'new' from news action
UNION ALL
select action.client, action.group, action.personcode, 'equal' from eq action
;
問題は、これらの 3 つの lasts select はそれぞれ 10 秒未満で実行されますが、 UNION
orを使用してそれらをマージするUNION ALL
と、delete または new または equal が空であっても、完全なクエリが約 90 秒続くことです。A または B で 3000 行を超える可能性があります。
この結果をより良く、より速く取得する方法はありますか?