ORACLE - 有条件地更新每一行(仅迭代 table 一次)
ORACLE - UPDATE each row conditionally (iterate table only once)
我有以下 SELECT 声明:
SELECT COUNT(*) FROM EPS_PROPOSAL
WHERE NSF_CODE = 14 OR
NSF_CODE = 5 OR
NSF_CODE = 3 OR
NSF_CODE = 45 OR
NSF_CODE = 11 OR
NSF_CODE = 2 OR
NSF_CODE = 7 OR
NSF_CODE = 46 OR
NSF_CODE = 37 OR
NSF_CODE = 22 OR
NSF_CODE = 40 OR
NSF_CODE = 9 OR
NSF_CODE = 47 OR
NSF_CODE = 19 OR
NSF_CODE = 13 OR
NSF_CODE = 4 OR
NSF_CODE = 48 OR
NSF_CODE = 42 OR
NSF_CODE = 49 OR
NSF_CODE = 50 OR
NSF_CODE = 31 OR
NSF_CODE = 27 OR
NSF_CODE = 10 OR
NSF_CODE = 41 OR
NSF_CODE = 39 OR
NSF_CODE = 35 OR
NSF_CODE = 21;
1 COUNT(*) = 902
现在,如果我尝试使用以下 UPDATE 语句遍历 EPS_PROPOSAL table:
UPDATE EPS_PROPOSAL
SET NSF_CODE = (CASE WHEN NSF_CODE = 14 THEN 3
WHEN NSF_CODE = 5 THEN 4
WHEN NSF_CODE = 3 THEN 5
WHEN NSF_CODE = 45 THEN 7
WHEN NSF_CODE = 11 THEN 8
WHEN NSF_CODE = 2 THEN 9
WHEN NSF_CODE = 7 THEN 11
WHEN NSF_CODE = 46 THEN 12
WHEN NSF_CODE = 37 THEN 13
WHEN NSF_CODE = 22 THEN 14
WHEN NSF_CODE = 40 THEN 41
WHEN NSF_CODE = 9 THEN 19
WHEN NSF_CODE = 47 THEN 20
WHEN NSF_CODE = 19 THEN 21
WHEN NSF_CODE = 13 THEN 2
WHEN NSF_CODE = 4 THEN 22
WHEN NSF_CODE = 48 THEN 23
WHEN NSF_CODE = 42 THEN 24
WHEN NSF_CODE = 49 THEN 25
WHEN NSF_CODE = 50 THEN 27
WHEN NSF_CODE = 31 THEN 29
WHEN NSF_CODE = 27 THEN 31
WHEN NSF_CODE = 10 THEN 34
WHEN NSF_CODE = 41 THEN 35
WHEN NSF_CODE = 39 THEN 37
WHEN NSF_CODE = 35 THEN 38
WHEN NSF_CODE = 21 THEN 39 END);
1,866 rows updated.
看来我的 UPDATE 语句不止一次遍历 table 来完成工作,但我试图一次遍历 table 1 行并更新每一行如果它满足其中一个条件 - 否则,我将覆盖我之前更新的内容。
底线 - 我应该只看到 902 行已更新。
有什么建议吗?
问题似乎不是 table 被多次读取。您的 UPDATE
语句没有 WHERE
子句,因此无论 nsf_code
值如何,它都会更新 table 中的每一行。如果要更新行的子集,则需要包含 WHERE
子句
UPDATE eps_proposal
SET nsf_code = (CASE ...)
WHERE nsf_code IN (14,5,3,...,21)
我有以下 SELECT 声明:
SELECT COUNT(*) FROM EPS_PROPOSAL
WHERE NSF_CODE = 14 OR
NSF_CODE = 5 OR
NSF_CODE = 3 OR
NSF_CODE = 45 OR
NSF_CODE = 11 OR
NSF_CODE = 2 OR
NSF_CODE = 7 OR
NSF_CODE = 46 OR
NSF_CODE = 37 OR
NSF_CODE = 22 OR
NSF_CODE = 40 OR
NSF_CODE = 9 OR
NSF_CODE = 47 OR
NSF_CODE = 19 OR
NSF_CODE = 13 OR
NSF_CODE = 4 OR
NSF_CODE = 48 OR
NSF_CODE = 42 OR
NSF_CODE = 49 OR
NSF_CODE = 50 OR
NSF_CODE = 31 OR
NSF_CODE = 27 OR
NSF_CODE = 10 OR
NSF_CODE = 41 OR
NSF_CODE = 39 OR
NSF_CODE = 35 OR
NSF_CODE = 21;
1 COUNT(*) = 902
现在,如果我尝试使用以下 UPDATE 语句遍历 EPS_PROPOSAL table:
UPDATE EPS_PROPOSAL
SET NSF_CODE = (CASE WHEN NSF_CODE = 14 THEN 3
WHEN NSF_CODE = 5 THEN 4
WHEN NSF_CODE = 3 THEN 5
WHEN NSF_CODE = 45 THEN 7
WHEN NSF_CODE = 11 THEN 8
WHEN NSF_CODE = 2 THEN 9
WHEN NSF_CODE = 7 THEN 11
WHEN NSF_CODE = 46 THEN 12
WHEN NSF_CODE = 37 THEN 13
WHEN NSF_CODE = 22 THEN 14
WHEN NSF_CODE = 40 THEN 41
WHEN NSF_CODE = 9 THEN 19
WHEN NSF_CODE = 47 THEN 20
WHEN NSF_CODE = 19 THEN 21
WHEN NSF_CODE = 13 THEN 2
WHEN NSF_CODE = 4 THEN 22
WHEN NSF_CODE = 48 THEN 23
WHEN NSF_CODE = 42 THEN 24
WHEN NSF_CODE = 49 THEN 25
WHEN NSF_CODE = 50 THEN 27
WHEN NSF_CODE = 31 THEN 29
WHEN NSF_CODE = 27 THEN 31
WHEN NSF_CODE = 10 THEN 34
WHEN NSF_CODE = 41 THEN 35
WHEN NSF_CODE = 39 THEN 37
WHEN NSF_CODE = 35 THEN 38
WHEN NSF_CODE = 21 THEN 39 END);
1,866 rows updated.
看来我的 UPDATE 语句不止一次遍历 table 来完成工作,但我试图一次遍历 table 1 行并更新每一行如果它满足其中一个条件 - 否则,我将覆盖我之前更新的内容。
底线 - 我应该只看到 902 行已更新。
有什么建议吗?
问题似乎不是 table 被多次读取。您的 UPDATE
语句没有 WHERE
子句,因此无论 nsf_code
值如何,它都会更新 table 中的每一行。如果要更新行的子集,则需要包含 WHERE
子句
UPDATE eps_proposal
SET nsf_code = (CASE ...)
WHERE nsf_code IN (14,5,3,...,21)