sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL, drag and swap

Příklad 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;

Příklad 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;

Pokud máte jedinečný index na (brkalk,brred) pak by to bylo složitější, protože při přečíslování bude duplicitní brred .

Ale pro mnoho řádků bych doporučil použít něco, co bylo velmi užitečné v dobách jazyka BASIC na 8bitových počítačích – očíslujte své řádky mezerami.

Takže místo:

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

použití:

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

Potom by vaše příklady vypadaly takto:

  • Příklad 1:update kalksad1 set brred=(2048+1024)/2 where kalk_id=43 , což by jej změnilo na:
    (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'),
    

  • Příklad 2:update kalksad1 set brred=(4096+3072)/2 where kalk_id=43 , což by jej změnilo na:
    (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'),
    

    Pouze pokud mezi řádky není mezera, kde by měl být cíl, musíte nejprve přečíslovat řádky například pomocí:

    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;
    

    To by bylo mnohem aster než měnit každý řádek mezi zdrojem a cílem. Ale na tom bude záležet pouze v případě, že bude potřeba změnit mnoho řádků.



    1. Jak obnovit databázi Sqlite po zálohování Androidu

    2. Hledání duplicitních řádků na serveru SQL Server

    3. Vytváření profilů v Oracle For User Security

    4. Chyby T-SQL, úskalí a osvědčené postupy – spoje