Обновление с использованием ошибки таблицы и наличия функции MIN без сохранения ключа - PullRequest
1 голос
/ 12 февраля 2020

У меня есть данные ниже в двух разных таблицах. Я могу получить необходимые записи, используя запрос выбора, однако я не могу обновить ROW_IND этих записей. Оператор обновления, который я использовал, выдает ошибку. Любые указатели будут высоко оценены.

Таблица CLP:

ID              KEY     EFF_DT              ROW_IND
28420000000006  4599    1/1/2000                1
28420000000006  21164   10/16/2019              1
28420000000011  58429   1/1/2000                1
28420000000011  68434   10/16/2019              1

Таблица ИПЦ:

KEY2    ID2 
21164   28420000000006
68434   28420000000011

Запрос:

SELECT  p.id ,  p.key, i.key AS KEY2, i.id AS ID2, p.EFF_DT, p.row_ind
  FROM CLP P, CLI I
 WHERE p.id = i.id
   AND P.KEY <> I.KEY
   AND p.row_ind = 1
   AND P.id IN
              (
                SELECT id 
                  FROM CLP
                 WHERE row_ind = 1
                 GROUP BY id
                 HAVING count(*) > 1
               );


ID              KEY      KEY2   ID2             EFF_DT          ROW_IND
28420000000006  4599    21164   28420000000006  1/1/2000                1
28420000000011  58429   68434   28420000000011  1/1/2000                1

Запрос на обновление:

UPDATE 
(
 < The Above SELECT Query >
) A
SET A.row_ind  = 0

Ошибка: ORA-01779 : не может изменить столбец, который сопоставляется с таблицей без сохранения ключа

1 Ответ

1 голос
/ 12 февраля 2020

Этот синтаксис для оператора UPDATE нельзя использовать в Oracle, а в MySQL. В качестве альтернативы вы можете попробовать использовать оператор MERGE:

MERGE INTO CLP t
    USING 
        (
          SELECT  p.id ,  p.key, i.key AS KEY2, i.id AS ID2, p.EFF_DT, p.row_ind
            FROM CLP p
            JOIN CPI i 
              ON p.id = i.id
           WHERE p.key <> i.key
             AND p.row_ind = 1
             AND P.id in
              (
              SELECT id 
                FROM CLP
               WHERE row_ind = p.row_ind
               GROUP BY id
              HAVING count(*) > 1
              ) 
         ) tt
      ON (tt.key2 = t.key)
    WHEN MATCHED THEN UPDATE SET t.row_ind = 0;

, где

  • , вам лучше преобразовать оператор SELECT старого стиля в синтаксис, содержащий явные JOIN ключевых слов вместо разделенных запятыми JOIN s
  • нет необходимости повторять условие row_ind = 1 дважды, более предпочтительно заменить второе на row_ind = p.row_ind

Демо

...