-2

以下のクエリがあり、それを調整するためのより良い方法があるかどうか知りたいですか?

MERGE INTO target_table TARGET USING
(SELECT DISTINCT g1.column_name
FROM test_gtt1 g1,
test_gtt2 g2
WHERE g1.column_name = g2.column_name
AND g1.diff_id      IS NULL
AND g2.diff_id      IS NULL
UNION ALL
SELECT DISTINCT g1.column_name
FROM test_gtt1 g1,
test_gtt2 g2
WHERE 
g1.column_name  = g2.column_name
AND g1.diff_id = g2.diff_id
AND g1.diff_id IS NOT NULL
AND g2.diff_id IS NOT NULL
) SOURCE ON ( TARGET.column_name = SOURCE.column_name)
WHEN MATCHED THEN
UPDATE SET TARGET.column_name2 = 123;
4

2 に答える 2

1

これは、データ型、インデックス、および生成された計画が何であるかによって異なります (これを提供していただければ助かります)。

しかし、共用体は明らかに冗長です。

SELECT DISTINCT g1.column_name
FROM test_gtt1 g1,
test_gtt2 g2
WHERE g1.column_name = g2.column_name
AND ((g1.diff_id IS NULL
      AND g2.diff_id IS NULL)
     OR (g1.diff_id IS NOT NULL
         AND g2.diff_id IS NOT NULL))

アップデート

(APC のコメントに返信するときに) を使用して同じ結果を得ることができることも思い浮かびました....

SELECT DISTINCT g1.column_name
FROM test_gtt1 g1,
test_gtt2 g2
WHERE g1.column_name = g2.column_name
AND DECODE(g1.diff_id, NULL, -1, 1)=DECODE(g2.diff_id, NULL, -1, 1);
于 2013-03-14T11:53:09.027 に答える
-1

これら 2 つのセットを UNION で結合する場合は、テストする必要はありませんdiff_id is nulldiff_id is not null

       select * from foo where bar is null
       union all
       select * from foo where bar is not null

と同じです

       select * from foo
于 2013-03-14T12:03:02.703 に答える