您的条件可以有效地重写为检查lt.col_1字段的值是否不等于“y”(即。
lt.col_1 is null or lt.col_1 != 'Y'
)我已经构建了一个快速测试用例来演示这一点,使用您的旧检查方法和新方法:
WITH t1 AS (SELECT 1 mt_id, 10 val FROM dual UNION ALL
SELECT 2 mt_id, 20 val FROM dual UNION ALL
SELECT 3 mt_id, 30 val FROM dual UNION ALL
SELECT 4 mt_id, 40 val FROM dual UNION ALL
SELECT 5 mt_id, 50 val FROM dual),
t2 AS (SELECT 2 lt_id, 'F' idx_2, NULL col_1 FROM dual UNION ALL
SELECT 3 lt_id, 'G' idx_2, NULL col_1 FROM dual UNION ALL
SELECT 4 lt_id, 'G' idx_2, 'N' col_1 FROM dual UNION ALL
SELECT 5 lt_id, 'G' idx_2, 'Y' col_1 FROM dual)
SELECT 'new_way' qry,
t1.mt_id,
t1.val,
CASE WHEN t2.col_1 is null or t2.col_1 != 'Y' THEN 'SF01' END new_stop_val
FROM t1
LEFT OUTER JOIN t2 ON t1.mt_id = t2.lt_id AND idx_2 = 'G'
UNION ALL
SELECT 'old_way' qry,
t1.mt_id,
t1.val,
CASE WHEN NOT EXISTS (SELECT 1 FROM t2 WHERE t2.LT_ID = t1.MT_ID AND t2.IDX_2 = 'G')
OR (SELECT t2.COL_1 FROM t2 WHERE t2.LT_ID = t1.MT_ID AND t2.IDX_2 = 'G') IS NULL
OR (SELECT t2.COL_1 FROM t2 WHERE t2.LT_ID = t1.MT_ID AND t2.IDX_2 = 'G') <> 'Y'
THEN 'SF01'
END new_stop_val
FROM t1
ORDER BY mt_ID, qry;
QRY MT_ID VAL NEW_STOP_VAL
new_way 1 10 SF01
old_way 1 10 SF01
new_way 2 20 SF01
old_way 2 20 SF01
new_way 3 30 SF01
old_way 3 30 SF01
new_way 4 40 SF01
old_way 4 40 SF01
new_way 5 50
old_way 5 50
现在,我们可以将大表上的检查折叠为单个检查,然后可以在单个case语句中检查大表中的其他列。这意味着您不再需要单独的update语句。您可以在单个merge语句中执行此操作,如下所示:
MERGE INTO main_table tgt
USING (SELECT mt.rowid, r_id,
CASE WHEN lt.col_1 is null or lt.col_1 != 'Y' THEN 'SF01'
WHEN lt.col_2 is null or lt.col_2 != 'Y' THEN 'SF02'
ELSE mt.stop_flag
END new_stop_flag,
CASE WHEN NVL(lt.col1, 'N') != 'Y' THEN 'E'
WHEN NVL(lt.col2, 'N') != 'Y' THEN 'E'
ELSE mt.es
END new_es,
CASE WHEN NVL(lt.col_1, 'N') != 'Y' THEN 'W'
WHEN NVL(lt.col_2, 'N') != 'Y' THEN 'W'
ELSE mt.pw
END new_pw
FROM main_table mt
LEFT JOIN large_table lt ON (mt.mt_id = lt.lt_id AND lt.idx_2 = 'G')
WHERE mt.stop_flag IS NULL
AND mt.idx_2 = 'G'
AND mt.es IS NULL
AND mt.ss = 'C'
AND mt.pw = 'A') src
ON (tgt.rowid = src.r_id)
WHEN MATCHED THEN
UPDATE tgt.stop_flag = src.new_stop_flag,
tgt.es = src.es,
tgt.pw = src.pw;