2013-03-21 118 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

也许你可以使用触发器与后/更新之前。