具有多个WHERE(关系)条件的SQL UPDATE

时间:2019-04-27 13:58:48

标签: sql oracle plsql oracle-sqldeveloper

我想知道是否可以在oracle SQL数据库中执行这样的UPDATE:

UPDATE mark
        SET
        mark=
        CASE
        WHEN mark.val<= 5 
            THEN val*1.1
        ELSE val END
        WHERE mark.id_classes = classes.id_classes 
            AND classes.ID_subject = subject.ID_subject
            AND subject.ID_subject = 5;

SQL开发人员在此部分返回错误:

WHERE mark.id_classes = classes.id_classes 
            AND classes.ID_subject = subject.ID_subject
            AND subject.ID_subject = 5;

所以我想不可能做出如此复杂的条件,那么还有其他方法吗?

尝试更多SELECT之类的条件可能很愚蠢,但另一方面,我不知道它为什么不起作用的原因。

3 个答案:

答案 0 :(得分:1)

您无法引用另外两个表(CLASSESSUBJECT),就像这样。以下代码显示了如何您可能会这样做:

update mark m set
  m.mark = (select case when m.val <= 5 then m.val * 1.1
                        else m.val
                   end
            from classes c join subject s on c.id_subject = s.id_subject
            where c.id_classes = m.id_classes
              and s.id_subject = 5
           )
where ... 

由于您没有在CASE中使用表别名,所以我不知道VAL列属于哪个表(因此我认为它是MARK)。

此外,UPDATE本身可能需要WHERE子句,这将限制要更新的行数。

答案 1 :(得分:1)

您可以使用子查询:

UPDATE mark
    SET mark = val * 1.1
    WHERE mark.val <= 5 AND
          EXISTS (SELECT 1
                  FROM classes c JOIN
                       subjects s
                       ON c.ID_subject = s.ID_subject
                  WHERE mark.id_classes = c.id_classes AND                       
                        s.ID_subject = 5
                 );

请注意,我将CASE条件移到了WHERE子句中,因此仅更新了需要更新的行。

答案 2 :(得分:1)

我发现在这种情况下,MERGE语句更容易理解:

MERGE INTO MARK m
  USING (SELECT c.ID_CLASSES
           FROM CLASSES c
           WHERE c.ID_SUBJECT = 5) d
    ON (m.ID_CLASSES = d.ID_CLASSES)
  WHEN MATCHED THEN
    UPDATE SET m.MARK = CASE
                          WHEN m.VAL <= 5 
                            THEN m.VAL * 1.1
                          ELSE
                             m.VAL
                        END

或者,由于ID_SUBJECT是一个常量,因此您可以简化更新到

UPDATE MARK m
  SET m.MARK = CASE
                 WHEN m.VAL <= 5 
                   THEN m.VAL * 1.1
                 ELSE
                   m.VAL
                 END
  WHERE m.ID_CLASSES = 5

好运。