如果不活动时间超过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));
它仅适用于一个值,如果有多个返回则失败。我在这里缺少什么?
如果有人可以告诉我正在发生的事情,我也会很感激。
答案 0 :(得分:3)
您使用WHERE customerNo = (SELECT ...);
这仅适用于1个值。尝试使用WHERE customerNo IN (SELECT ...);
答案 1 :(得分:2)
有许多方法可以处理子查询返回多行。要解决的问题是返回多个值的子查询是否正确,或者它是否应该只返回一行。对子查询的equals运算符期望只返回一行/记录。
此外,MONTHS_BETWEEN会在两个日期之间返回月。如果您想查看天数,请使用b.activity - SYSDATE > 30
,反之亦然。
假设有多行有效 -
子查询中不需要第二次连接到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表别名是指正在更新的表。
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