2013-03-21 47 views
0

我目前正在創建一個更新語句,它將更新一個雙時間表。它執行以下操作:在DB2更新中重複子查詢

爲每個ID更新每行,並將RELATION_ID設置爲最新行的RELATION_ID。

在此查詢中,有一個重複的子查詢(因爲我第一次用它來獲得用於更新值),也(我不想更新其已經具備了這種RELATION_ID行)

有的方式重複使用來自所述第一查詢或(需要不編程,純SQL)的值的任何替代方案

UPDATE TBL_CLIENT UPD 
SET RELATION_ID = (
        SELECT RELATION_ID FROM TBL_CLIENT SUBQ 
        WHERE UPD.ID = SUBQ.ID AND 
         UPDATE_TIMESTAMP = (
              SELECT MAX(UPDATE_TIMESTAMP) FROM TBL_CLIENT SUBSQ 
              WHERE SUBSQ.ID = SUBQ.ID 
              ) 
       )    
WHERE ID IN ( 
        SELECT ID 
        FROM TBL_CLIENT QU 
        GROUP BY ID 
        HAVING COUNT(DISTINCT(RELATION_ID)) > 1 
        ) AND   
     RELATION_ID <> (
         SELECT RELATION_ID FROM TBL_CLIENT SUBQ2 
         WHERE UPD.ID = SUBQ2.ID AND 
           UPDATE_TIMESTAMP = (
                -- Update mit STID des neusten Eintrages 
                SELECT MAX(UPDATE_TIMESTAMP) FROM TBL_CLIENT SUBSQ2 
                WHERE SUBSQ2.ID = SUBQ2.ID 
               ) 
        ) 

實施例:

ID/RELATION_ID/UPDATE_TIMESTAMP

  • 10分之1/ 2000年1月1日
  • 一十二分之一/ 2002年1月5日
  • 15分之1/ 2008年3月28日

更新後:

  • 15分之1/ 1.1.2000
  • 1/15/5.1.2002
  • 1/15/28.3.2008

最後一行是最近的一排,因此它的關係id被採取(與該行本身沒有更新!對未包括在這裏查詢的另一部分重要的)

謝謝對於任何建議

+0

建議是用'merge'替換'update'。 。 。 http://stackoverflow.com/questions/4184209/inner-join-in-update-sql-for-db2。 – 2013-03-21 13:33:06

+0

表的主鍵是什麼? – 2013-03-21 14:34:20

+0

主鍵由多元素元素組成,包括ID,時間戳記,但不包含Relation_Id – Xavjer 2013-03-21 14:46:56

回答

0

可以更新視圖:

UPDATE 
    (SELECT t.id, t.update_timestamp, ...  --- all the PK columns 
      t.relation_id, 
      m.relation_id AS new_relation_id 
    FROM 
     TBL_CLIENT AS t 
     JOIN 
     (SELECT id, relation_id, 
       ROW_NUMBER() OVER (PARTITION BY id 
            ORDER BY update_timestamp DESC) 
        AS rn 
      FROM TBL_CLIENT 
     ) AS m 
     ON m.id = t.id 
    WHERE m.rn = 1 
     AND m.relation_id <> t.relation_id 
) AS upd 
SET 
    relation_id = new_relation_id ; 
+0

更改您的JOIN與我的部分爲最大tsd,選擇返回所需的所有值,但我沒有得到它作爲更新:/ – Xavjer 2013-03-21 15:13:28

+0

我的答案不工作?您正在使用哪個版本的DB2? – 2013-03-21 15:23:27

+0

查看修改。你可能必須包括PK。 – 2013-03-21 15:26:21

0

這可能適合你 - (我不知道確切的語法。我在Sybase上工作,所以這是按照SYBASE)

UPDATE TBL_CLIENT AA 
    SET RELATION_ID = BB.RELATION_ID 
FROM 
    TBL_CLIENT AA, 
    TBL_CLIENT BB 
WHERE 
    AA.ID=BB.ID 
    AND BB.UPDATE_TIMESTAMP=(SELECT MAX(UPDATE_TIMESTAMP) FROM TBL_CLIENT CC WHERE CC.ID=BB.ID) 
+0

或者給出樣本數據和期望的輸出結果 – DSD 2013-03-21 13:47:56

+0

實際上,在DB2的更新中不可能定義多個表,聲明在那裏不存在,如果可能的話,這將是一個很好的解決方案。用一個小例子更新我的文章 – Xavjer 2013-03-21 14:07:04

-1

也許你可以使用觸發器與後/更新之前。