在DB2更新中重复子查询

时间:2013-03-21 12:59:14

标签: sql db2 subquery updates

我目前正在创建一个更新语句,它将更新双时态表。它执行以下操作:

为每个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

  • 1/10 / 1.1.2000
  • 1/12 / 5.1.2002
  • 1/15 / 28.3.2008

更新后:

  • 1/15 / 1.1.2000
  • 1/15 / 5.1.2002
  • 1/15 / 28.3.2008

最后一行是最近的一行,因此它的关系id被占用了(并且行本身没有被更新!,对于查询的其他部分非常重要,这里没有包含)

感谢您的任何建议

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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 ;

答案 2 :(得分:-1)

可能你可以在更新之前/之后使用触发器。