PL/SQL:WHERE子句中有多个匹配的UPDATE查询

4

表格A:

ID      TYPE    DATE_UPLOADED   EXPIRED
9872    APPLE   03-JAN-11       0
9874    MANGO   03-JAN-11       0
9873    GRAPE   03-JAN-11       0

表B:

TYPE    LIFE
APPLE   3
MANGO   2
GRAPE   1

我希望在这里实现的是,当“DATE_UPLOADED”超过当前日期的“LIFE”时,将“TABLE_A”的“EXPIRED”字段更新为“1”。
以下是我目前遇到问题的更新查询语句。我知道它是错误的,所以需要你的帮助。
更新查询语句:
UPDATE TABLE_A
SET EXPIRED = 1
WHERE EXPIRED = 0
AND (TRUNC(SYSDATE) - TRUNC(DATE_UPLOADED)) >
(
    SELECT LIFE
    FROM TABLE_B 
);

请注意,TYPE字段可能是任何内容,并且可能比示例数据中给出的要多。

2
可能是重复的问题: https://dev59.com/k3E95IYBdhLWcg3wHqSl - Mike Nakis
谢谢提供参考。虽然问题不同,但“可能”可以使用相同的解决方案。 - cr8ivecodesmith
1个回答

4
您没有将这两个表格进行关联。请尝试以下方式:
UPDATE TABLE_A
SET EXPIRED = 1
WHERE EXPIRED = 0
AND (TRUNC(SYSDATE) - TRUNC(DATE_UPLOADED)) >
(
    SELECT LIFE
    FROM TABLE_B 
    WHERE TYPE = TABLE_A.TYPE
);

1
这不是适用于Oracle的有效SQL。 - user330315
好的观点。我认为它也不是有效的ANSI SQL。已编辑。 - David M
最好在子查询中使用一些聚合函数,以确保只返回单行结果。否则可能会出现“返回多行结果”的错误。 - user330315
问题中提到的是特定类型的生命,因此我的假设是在这种情况下不需要它。一般来说,我同意。 - David M
谢谢这个!省了我很多麻烦。 - cr8ivecodesmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接