【问题标题】:Oracle UPDATE with two tables & CASES带有两个表和案例的 Oracle UPDATE
【发布时间】:2020-07-02 03:54:03
【问题描述】:

我有两张桌子。我正在尝试根据不同表中存在的 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;

请帮我解决这个问题。

【问题讨论】:

    标签: sql oracle sql-update


    【解决方案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
                     );
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        你快到了 - 使用 updatable join view

        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
        

        【讨论】:

          猜你喜欢
          • 2017-08-30
          • 1970-01-01
          • 2020-09-15
          • 1970-01-01
          • 2021-03-27
          • 1970-01-01
          • 2013-12-26
          • 2012-12-25
          • 1970-01-01
          相关资源
          最近更新 更多