SQL修改问题

时间:2011-02-19 14:09:51

标签: sql oracle

如果不活动时间超过30天,我需要为SQL中的Table替换很多值。

我有

UPDATE VERSION 
   SET isActive = 0
 WHERE customerNo = (SELECT c.VersionNo
                       FROM Activity b 
                      INNER JOIN VERSION c ON b.VersionNo = c.VersionNo
                      WHERE (Months_between(sysdate, b.Activitye) > 30));

它仅适用于一个值,如果有多个返回则失败。我在这里缺少什么?

如果有人可以告诉我正在发生的事情,我也会很感激。

4 个答案:

答案 0 :(得分:3)

您使用WHERE customerNo = (SELECT ...);这仅适用于1个值。尝试使用WHERE customerNo IN (SELECT ...);

答案 1 :(得分:2)

有许多方法可以处理子查询返回多行。要解决的问题是返回多个值的子查询是否正确,或者它是否应该只返回一行。对子查询的equals运算符期望只返回一行/记录。

此外,MONTHS_BETWEEN会在两个日期之间返回。如果您想查看天数,请使用b.activity - SYSDATE > 30,反之亦然。

假设有多行有效 -

IN子句

子查询中不需要第二次连接到VERSION表:

UPDATE VERSION 
   SET isActive = 0
 WHERE customerNo IN (SELECT c.customerno
                        FROM Activity b 
                       WHERE b.VersionNo = VERSION.VersionNo
                         AND MONTHS_BETWEEN(SYSDATE, b.activity) > 30);

VERSION表别名是指正在更新的表。

EXISTS条款

UPDATE VERSION 
   SET isActive = 0
 WHERE EXISTS(SELECT NULL
                FROM ACTIVITY a
               WHERE VERSION.customerno = a.customerno
                 AND VERSION.versionno = a.versionno
                 AND MONTHS_BETWEEN(SYSDATE, b.activity) > 30);

只能有一个?

如果只返回一行,则可以考虑适当的聚合函数(MIN,MAX)。

答案 2 :(得分:1)

替换

WHERE customerNo = 

WHERE customerNo IN

答案 3 :(得分:1)

MERGE INTO VERSION dest
USING (SELECT ver.VersionNo
FROM Activity act 
INNER JOIN VERSION ver ON act.VersionNo = var.VersionNo
WHERE (Months_between(sysdate, act.Activitye) > 30)) src
ON (scr.customerNo = dest.customerNo)
WHEN MATCHED THEN
UPDATE SET isActive = 0