1

テーブル内のすべてのレコードを更新しようとしています。レコードを読み進めるときに、現在のレコードの列をセット内のNEXTレコードの値で更新する必要があります。キャッチは、更新を指定された順序で実行する必要があることです。

こんなことを考えていた…

Update t1
Set col1 = (select LEAD(col2,1) OVER (ORDER BY col3, col4, col5)
            from t1);

これはコンパイルされませんが、私が何を推進しているのかわかります...何かアイデアはありますか?

... アップデート

このピースは正常に実行されますが、NULLのみを書き込みます

Update t1 A
Set t1.col1 = (select LEAD(col2,1) OVER (ORDER BY col3, col4, col5)
           from t1 B
           where A.col3 = B.col3 AND
                 A.col4 = B.col4 AND
                 A.col5 = B.col5);
4

3 に答える 3

1

これはそれを行う必要があります:

merge into t1
using
(
   select rowid as rid, 
          LEAD(col2,1) OVER (ORDER BY col3, col4, col5) as ld
   from t1
) lv on ( lv.rid = t1.rowid )
when matched then 
  update set col1 = lv.ld;

構文が完全に正しいかどうかは100%わかりませんが、テストデータを提供しなかったため、修正できるように潜在的な構文エラーを残しておきます。

rowidの使用法をテーブルの実際の主キー列に置き換えることもできます。

于 2012-10-25T17:48:47.870 に答える
0

カーソルを使ってみませんか?指定した順序でカーソル内で更新を使用できます。

于 2012-10-25T17:27:31.923 に答える
0

with次のステートメントを使用してこれを行うことができます。

with toupdate as (
    select t1.*,
           lead(col2, 1) over (order by col3, col4, col5) as nextval
    from t1
)
Update toupdate
    Set col1 = nextval

ちなみに、これはアップデートの順序を保証するものではありません。ただし、col2はパーティショニング句で言及されていないため、正しいことを行う必要があります。

上記の構文はSQLServerでは機能しますが、Oracleでは機能しません。元の質問ではデータベースが指定されていませんでした(leadSQL Server 2012で有効な関数です)。このmergeステートメントは、サブクエリの値を取得する方法のようです。

于 2012-10-25T17:52:16.790 に答える