具有两个表和案例的Oracle UPDATE

时间:2020-03-21 02:16:29

标签: sql oracle sql-update

我有两个桌子。我正在尝试根据不同表中存在的 type 字段和 feature 字段更新表中所有记录的 can_swim 字段。

有机表格:

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 个答案:

答案 0 :(得分:1)

使用子查询:

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
                 );

答案 1 :(得分:1)

您可以使用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;

答案 2 :(得分:0)

您快到了-使用Gif of the ViewPager

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
相关问题