PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL, seret dan tukar

Contoh 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;

Contoh 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;

Jika Anda memiliki indeks unik di (brkalk,brred) maka akan lebih rumit, karena pada saat penomoran ulang akan terjadi duplikat brred .

Tetapi untuk banyak baris, saya sarankan menggunakan sesuatu yang sangat berguna pada masa bahasa BASIC pada komputer 8bit - beri nomor baris Anda dengan celah.

Jadi, alih-alih:

(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'),

gunakan:

(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'),

Maka contoh Anda akan terlihat seperti:

  • Contoh 1:update kalksad1 set brred=(2048+1024)/2 where kalk_id=43 , yang akan mengubahnya menjadi:
    (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'),
    

  • Contoh 2:update kalksad1 set brred=(4096+3072)/2 where kalk_id=43 , yang akan mengubahnya menjadi:
    (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'),
    

    Hanya jika tidak ada celah di antara baris di mana target seharusnya berada, Anda harus terlebih dahulu memberi nomor ulang baris menggunakan misalnya:

    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;
    

    Ini akan jauh lebih baik daripada mengubah setiap baris antara sumber dan target. Tapi ini hanya masalah jika ada banyak baris yang harus diubah.



    1. Database
    2.   
    3. Mysql
    4.   
    5. Oracle
    6.   
    7. Sqlserver
    8.   
    9. PostgreSQL
    10.   
    11. Access
    12.   
    13. SQLite
    14.   
    15. MariaDB
    1. Praktik Terbaik Replikasi PostgreSQL - Bagian 1

    2. Transaksi Otonom di PostgreSQL 9.1

    3. Kembalikan nilai kolom pra-PERBARUI menggunakan SQL saja

    4. Instal PostgreSQL di Ubuntu 20.04

    5. Java JDBC mengabaikan setFetchSize?