为ORACLE编写带有联接的update语句

zqry0prt  于 2023-08-03  发布在  Oracle
关注(0)|答案(3)|浏览(93)

我正在尝试使用以下Oracle SQL语句:

update task  
set t.dtdue = add_months(p.dtapplication,48)
from task t
inner join ptoprocedure p on p.idproc = t.idproc
where t.idprocess = 1017 and t.idactivity = 6

字符串
它似乎不工作,我想知道如果我使用的语法只适用于SQL Server。我发现对于Oracle,需要在更新中使用select语句,但我无法弄清楚。谢谢你的帮助
我尝试在更新内部使用select语句

t3psigkw

t3psigkw1#

您可以使用相关子查询将其重新表述为更新:

UPDATE task t  
SET dtdue = (SELECT ADD_MONTHS(p.dtapplication, 48)
             FROM ptoprocedure p
             WHERE p.idproc = t.idproc)
WHERE t.idprocess = 1017 AND t.idactivity = 6;

字符串

t40tm48m

t40tm48m2#

是的,您的查询更符合SQL Server而不是Oracle。在Oracle中,你可以使用相关的subquery.you可以做如下,

UPDATE task t
SET t.dtdue = (
  SELECT add_months(p.dtapplication, 48)
  FROM ptoprocedure p
  WHERE p.idproc = t.idproc
)
WHERE t.idprocess = 1017 
AND t.idactivity = 6
AND EXISTS (
  SELECT 1 
  FROM ptoprocedure p 
  WHERE p.idproc = t.idproc
);

字符串
这将更新任务表中的dtdue列,方法是从ptoprocedure表向dtapplication添加48个月,对于idprocess = 1017idactivity = 6所在的行。
EXISTS子句用于防止在ptoprocedure表中没有对应的idproc时更新任务表中的行。如果没有此子句,则如果子查询不返回任何行,则dtdue字段将设置为NULL

ifmq2ha2

ifmq2ha23#

如果p.idproc是唯一的(也就是说,如果它是唯一的键或主键,或者它上有唯一的索引,或者如果你使用的是Oracle 21c或更高版本,它不需要索引),那么你可以这样做:

update (
    select t.dtdue, p.dtapplication
    from   task t join ptoprocedure p on p.idproc = t.idproc
    where  t.idprocess = 1017 and t.idactivity = 6
)
set dtdue = add_months(dtapplication,48)

字符串
或者如果你愿意的话

update (
    select t.dtdue, add_months(dtapplication,48) as new_date
    from   task t join ptoprocedure p on t.idproc = p.idproc
    where  t.idprocess = 1017 and t.idactivity = 6
)
set dtdue = new_date

相关问题