2013-12-20 24 views
1

我有两个表。其中一张包含一张门票列表,其中一张包含每张门票中的所有评论。一张票有一个所有者,评论者由他们的user_id跟踪。Oracle SQL:为更新选择正确的值

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

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?

+0

Oracle是否'update'支持'join'?你的语法看起来更像MySQL。 –

+0

@GordonLinoff一个很大的否......但有一些技巧,例如在MERGE USING子句或在线视图 – SriniV

+0

中使用连接,请显示表格模式,示例数据和预期结果。 – OldProgrammer

回答

3

你可以试试这个任何一个甲骨文

正常的更新

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); 

使用内嵌视图(如果它是由甲骨文认为更新)

注意:如果你面对一个非关键保存行错误添加一个索引来解决相同的问题,使其更新

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; 
+0

+1超级完整答案:) –