更新字段,其中项目是子查询的一部分

时间:2019-07-13 22:46:05

标签: sql oracle

我正在测试某些软件,需要手动对字段进行一些调整。对于工厂A生产的所有项目,需要为生产这些项目的其他工厂调整提前期。但是,其他工厂的其他项目需要正常的交货时间。

我有一个查询来选择在备用工厂生产的物料。我尝试使用存在的update并将其作为子查询。我似乎无法使其正常工作

  update newgdmoperation
  set newgdmoperation.productionoffset = 75
  where exists
(
  select
newgdmoperation.operationid
from newgdmoperation
right join
(
  select mainproductid,productionoffset
  from newgdmoperation
  where fromlocationid = 'KR'
  and transporttype like 'Ves%'
) a
on newgdmoperation.mainproductid = a.mainproductid
where fromlocationid <> 'KR'
and transporttype like 'Ves%'
)

这不会产生任何错误结果。但是,它将更新所有项目的字段。 实际上,where子句下的子查询返回需要更新的项目的operationid(唯一ID)。我期望使用where存在,只有子查询中的项目会被更新,而其余的则保持不变。

1 个答案:

答案 0 :(得分:1)

假设您要更新NEWGDMOPERATION表,在我看来您应该使用IN而不是EXISTS,因此您的声明应该是

UPDATE NEWGDMOPERATION g
  SET g.PRODUCTIONOFFSET = 75
  WHERE g.OPERATIONID IN (SELECT g2.OPERATIONID
                            FROM NEWGDMOPERATION g2
                            RIGHT JOIN (SELECT g3.MAINPRODUCTID,
                                               g3.PRODUCTIONOFFSET
                                          FROM NEWGDMOPERATION g3
                                          WHERE g3.FROMLOCATIONID = 'KR' AND
                                                g3.TRANSPORTTYPE LIKE 'VES%') a
                              ON g2.MAINPRODUCTID = a.MAINPRODUCTID
                            WHERE g2.FROMLOCATIONID <> 'KR' AND
                                  g2.TRANSPORTTYPE LIKE 'VES%')