Oracle SQL:为更新选择正确的值

时间:2013-12-20 15:56:44

标签: sql oracle sql-update

我有两张桌子。一个包含票证列表,一个包含每个票证中的所有注释。票证有所有者,评论制作者由他们的user_id跟踪。

我想将门票的所有者设置为发出第一条评论的用户。脚本的基础是:

update incident inc
inner join incidentdescription incdes on 
  inc.inci_id = incdes.inci_id
set inc.owner_id=incdes.user_id;

但是,每张票都有几条评论。我可以通过incdes.creationdate跟踪第一条评论。我需要有最老的一个。但是,如何确保在设置部分从每张票的最旧评论中选择incdes.user_id?

1 个答案:

答案 0 :(得分:3)

您可以在Oracle中尝试其中任何一项

正常更新

UPDATE
      INCIDENT
SET
      INCIDENT.OWNER_ID =
          ( SELECT
                INCIDENTDESCRIPTION.USER_ID
           FROM
                INCIDENTDESCRIPTION
           WHERE
                INCIDENT.OWNER_ID = INCIDENTDESCRIPTION.USER_ID )
WHERE
      EXISTS
          (SELECT
                INCIDENTDESCRIPTION.USER_ID
           FROM
                INCIDENTDESCRIPTION
           WHERE
                INCIDENT.OWNER_ID = INCIDENTDESCRIPTION.USER_ID);

使用内嵌视图(如果Oracle认为可以更新)

注意:如果您遇到非密钥保留行错误,请添加索引以解析相同内容以使其可更新

UPDATE
      (SELECT
            INCIDENT.OWNER_ID AS OLD,
            INCIDENTDESCRIPTION.USER_ID AS NEW
       FROM
                INCIDENT
            INNER JOIN
                INCIDENTDESCRIPTION
            ON INCIDENT.INCI_ID = INCIDENTDESCRIPTION.INCI_ID) T
SET
      T.OLD     = T.NEW;

使用合并

MERGE INTO
      INCIDENT
USING
      (SELECT
            T1.ROWID AS RID,
            T2.INCI_ID
       FROM
                INCIDENT T1
            INNER JOIN
                INCIDENTDESCRIPTION T2
            ON INCIDENT.INCI_ID = INCIDENTDESCRIPTION.INCI_ID)
ON
      ( ROWID = RID )
WHEN MATCHED
THEN
    UPDATE SET INCIDENT.INCI_ID = INCIDENTDESCRIPTION.INCI_ID;