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
  • 2008.3.1 / 15 / 28

更新後:

  • 1 / 15 / 1.1.2000
  • 1 / 15 / 5.1.2002
  • 2008.3.1 / 15 / 28

最後の行は最新の行であったため、リレーション 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 に答える