我目前正在创建一个更新语句,它将更新双时态表。它执行以下操作:
为每个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
更新后:
最后一行是最近的一行,因此它的关系id被占用了(并且行本身没有被更新!,对于查询的其他部分非常重要,这里没有包含)
感谢您的任何建议
答案 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)
可能你可以在更新之前/之后使用触发器。