2013-12-20 47 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超級完整答案:) –