0

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

为每个 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 被采用(并且行本身没有更新!,对于此处未包含的查询的其他部分很重要)

感谢您的任何建议

4

3 回答 3

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)
于 2013-03-21T13:45:37.433 回答
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 ;
于 2013-03-21T14:43:24.120 回答
-1

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

于 2013-03-21T16:13:45.917 回答