Oracle ОБНОВЛЕНИЕ с двумя таблицами и СЛУЧАЯМИ - PullRequest
1 голос
/ 21 марта 2020

У меня есть две таблицы. Я пытаюсь обновить поле can_swim для всех записей в таблице на основе поля type и поля feature , которое присутствует в другой таблице.

Таблица организмов:

id    type     can_swim 
----------------------
1     raven    (null)   
2     dog      (null)          
3     fish     (null)         

Таблица описания:

id    feature
-------------------
1      wings
2      legs
3      fins

Ошибка, с которой я столкнулся при запросе: :

Error at Command Line : 1 Column : 1
        Error report -
        SQL Error: ORA-00971: missing SET keyword
        00971. 00000 -  "missing SET keyword"
        *Cause:    
        *Action:

Я в замешательстве, так как в моем запросе есть ключевое слово SET.

ORACLE Запрос:

UPDATE organism o,  description d
SET o.can_swim = 
CASE
    WHEN o.type = 'raven' AND d.feature = 'wings' THEN 'No'
    WHEN o.type = 'dog'   AND d.feature = 'legs'  THEN 'Yes'
    WHEN o.type = 'fish'  AND d.feature = 'fins'  THEN 'Yes'
END
where o.id = d.id;

Пожалуйста, помогите мне решить эту проблему.

Ответы [ 3 ]

1 голос
/ 21 марта 2020

Вы можете использовать оператор merge следующим образом:

MERGE INTO ORGANISM O
USING (SELECT O.ID, CASE
                       WHEN o.type = 'raven' AND d.feature = 'wings' THEN 'No'
                       WHEN o.type = 'dog' AND d.feature = 'legs' THEN 'Yes'
                       WHEN o.type = 'fish' AND d.feature = 'fins' THEN 'Yes'
                    END AS CAN_SWIM
        FROM organism o JOIN description d ON O.ID = D.ID) SRC
ON (O.ID = SRC.ID)
WHEN MATCHED THEN 
UPDATE SET o.can_swim = SRC.CAN_SWIM;
1 голос
/ 21 марта 2020

Использовать подзапрос:

UPDATE organism o
    SET o.can_swim = (SELECT CASE WHEN o.type = 'raven' AND d.feature = 'wings' THEN 'No'
                                  WHEN o.type = 'dog'   AND d.feature = 'legs'  THEN 'Yes'
                                  WHEN o.type = 'fish'  AND d.feature = 'fins'  THEN 'Yes'
                             END
                      FROM description d
                      WHERE o.id = d.id
                     );

Если вы не хотите обновлять все строки, тогда подзапрос полезен:

UPDATE organism o
    SET o.can_swim = (SELECT CASE WHEN o.type = 'raven' AND d.feature = 'wings' THEN 'No'
                                  WHEN o.type = 'dog'   AND d.feature = 'legs'  THEN 'Yes'
                                  WHEN o.type = 'fish'  AND d.feature = 'fins'  THEN 'Yes'
                             END
                      FROM description d
                      WHERE o.id = d.id
                     )
    WHERE EXISTS (SELECT 1
                  FROM description d
                  WHERE o.id = d.id
                 );
0 голосов
/ 21 марта 2020

Вы были почти там - используйте обновляемое представление соединения

update (
  select o.id, o.can_swim, o.type, d.feature
  from organism o
  join Description d
  on o.id = d.id
)
set can_swim =
    CASE
       WHEN type = 'raven' AND feature = 'wings' THEN 'No'
       WHEN type = 'dog'   AND feature = 'legs'  THEN 'Yes'
       WHEN type = 'fish'  AND feature = 'fins'  THEN 'Yes'
   END


select * from organism; 

        ID TYPE  CAN_SWIM           
---------- ----- -------------------
         1 raven No                 
         2 dog   Yes                
         3 fish  Yes    

Обратите внимание, что таблица description должна иметь первичный ключ на id (или хотя бы уникальный индекс). В противном случае вы получите ошибку

ORA-01779: cannot modify a column which maps to a non key-preserved table
...