ORACLE - ОБНОВИТЬ каждую строку условно (повторять таблицу только один раз) - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть следующий оператор 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

Теперь, если я попытаюсь перебрать таблицу EPS_PROPOSAL с помощью следующего оператора UPDATE:

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оператор выполнял итерацию по моей таблице более одного раза, чтобы выполнить работу, но я пытаюсь пройти по строке таблицы 1 за раз и обновить каждую строку, если она удовлетворяет одному из условий - в противном случае, я перезаписываю то, что ранее обновляло.

Итог - я должен видеть только 902 обновленных строки.

Есть предложения?

1 Ответ

0 голосов
/ 09 февраля 2019

Проблема не в том, что таблица читается несколько раз.Ваш оператор UPDATE не имеет предложения WHERE, поэтому он будет обновлять каждую строку в таблице независимо от значения nsf_code.Если вы хотите обновить подмножество строк, вам необходимо включить WHERE предложение

UPDATE eps_proposal
   SET nsf_code = (CASE ...)
 WHERE nsf_code IN (14,5,3,...,21)
...