sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL、ドラッグアンドスワップ

    例1:

    update kalksad1 set brred=_brred
    from (
      select
        row_number() over (
          order by brred<2 desc, brred=4 desc, brred>=2 desc, brred
        ) as _brred,
        kalk_id as _kalk_id
      from kalksad1
      where brkalk=2
      order by _kalk_id
    ) as _
    where kalk_id=_kalk_id and brred!=_brred;
    

    例2:

    update kalksad1 set brred=_brred
    from (
      select
        row_number() over (
          order by brred<4 desc, brred!=1 desc, brred>=4 desc, brred
        ) as _brred,
        kalk_id as _kalk_id
      from kalksad1
      where brkalk=2
      order by _kalk_id
    ) as _
    where kalk_id=_kalk_id and brred!=_brred;
    

    (brkalk,brred)に一意のインデックスがある場合 番号の付け直し中にbrredが重複するため、より複雑になります。 。

    しかし、多くの行には、8ビットコンピューターのBASIC言語の時代に非常に役立つものを使用することをお勧めします。行にギャップを付けて番号を付けます。

    代わりに:

    (26, 2, 1, 'text index 26 doc 2 row 1'),
    (30, 2, 2, 'text index 30 doc 2 row 2'),
    (42, 2, 3, 'text index 42 doc 2 row 3'),
    (43, 2, 4, 'text index 43 doc 2 row 4'),
    (12, 2, 5, 'text index 12 doc 2 row 5'),
    

    使用:

    (26, 2, 1024, 'text index 26 doc 2 row 1'),
    (30, 2, 2048, 'text index 30 doc 2 row 2'),
    (42, 2, 3072, 'text index 42 doc 2 row 3'),
    (43, 2, 4096, 'text index 43 doc 2 row 4'),
    (12, 2, 5120, 'text index 12 doc 2 row 5'),
    

    その場合、例は次のようになります。

  1. 例1:update kalksad1 set brred=(2048+1024)/2 where kalk_id=43 、これは次のように変更されます:
    (26, 2, 1024, 'text index 26 doc 2 row 1'),
    (43, 2, 1536, 'text index 43 doc 2 row 4'),
    (30, 2, 2048, 'text index 30 doc 2 row 2'),
    (42, 2, 3072, 'text index 42 doc 2 row 3'),
    (12, 2, 5120, 'text index 12 doc 2 row 5'),
    

  2. 例2:update kalksad1 set brred=(4096+3072)/2 where kalk_id=43 、これは次のように変更されます:
    (30, 2, 2048, 'text index 30 doc 2 row 2'),
    (42, 2, 3072, 'text index 42 doc 2 row 3'),
    (26, 2, 3584, 'text index 26 doc 2 row 1'),
    (43, 2, 4096, 'text index 43 doc 2 row 4'),
    (12, 2, 5120, 'text index 12 doc 2 row 5'),
    

    ターゲットがあるべき行の間にギャップがない場合にのみ、最初に次の例を使用して行の番号を付け直す必要があります。

    update kalksad1 set brred=_brred*1024
    from (
      select row_number() over (order by brred) as _brred, kalk_id as _kalk_id
      from kalksad1
      where brkalk=2
      order by _brred desc
    ) as _
    where kalk_id=_kalk_id;
    

    これは、ソースとターゲットの間ですべての行を変更するよりもはるかに簡単です。ただし、これは、変更する行が多数ある場合にのみ問題になります。



    1. キーワード'with'の近くの構文が正しくありません...前のステートメントはセミコロンで終了する必要があります

    2. SQLでの順序付けされていない結果

    3. 初心者のためのSQLAND演算子

    4. Oracleは例外を除いてディレクトリからファイルを読み取りました