我想知道是否可以在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
之类的条件可能很愚蠢,但另一方面,我不知道它为什么不起作用的原因。
答案 0 :(得分:1)
您无法引用另外两个表(CLASSES
和SUBJECT
),就像这样。以下代码显示了如何您可能会这样做:
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
好运。