PostgreSQL
 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 .

Но за много редове бих препоръчал да използвате нещо, което беше много полезно в дните на BASIC езика на 8-битови компютри - номерирайте редовете си с пропуски.

Така че вместо:

(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: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: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. Database
    2.   
    3. Mysql
    4.   
    5. Oracle
    6.   
    7. Sqlserver
    8.   
    9. PostgreSQL
    10.   
    11. Access
    12.   
    13. SQLite
    14.   
    15. MariaDB
    1. Задействане с име на динамично поле

    2. Автоматизиране на барман с кукла:it2ndq/барман (първа част)

    3. Допълване на нули вляво в postgreSQL

    4. Извадете дни от дата в PostgreSQL

    5. Как да направя актуализация + присъединяване в PostgreSQL?