sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL, slepen en wisselen

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

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

Als u een unieke index heeft op (brkalk,brred) dan zou het ingewikkelder zijn, omdat er tijdens het hernummeren dubbele brred . zal zijn .

Maar voor veel rijen raad ik aan iets te gebruiken dat erg handig was in de dagen van BASIC-taal op 8bit-computers - nummer je rijen met gaten.

Dus in plaats van:

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

gebruik:

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

Dan zouden uw voorbeelden er zo uitzien:

  • Voorbeeld 1:update kalksad1 set brred=(2048+1024)/2 where kalk_id=43 , wat het zou veranderen in:
    (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'),
    

  • Voorbeeld 2:update kalksad1 set brred=(4096+3072)/2 where kalk_id=43 , wat het zou veranderen in:
    (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'),
    

    Alleen als er geen ruimte is tussen de rijen waar het doel zou moeten zijn, moet u eerst de rijen hernummeren met bijvoorbeeld:

    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;
    

    Dit zou veel aster zijn dan elke rij tussen bron en doel te veranderen. Maar dit is alleen van belang als er veel rijen moeten worden gewijzigd.



    1. elimineer dubbele matrixwaarden in postgre

    2. Modal Window-berichten weergeven in Oracle Forms met Show_Alert

    3. Kan een Android-app rechtstreeks verbinding maken met een online mysql-database?

    4. SSMS 2016-fout bij het importeren van Azure SQL v12 bacpac:hoofdsleutels zonder wachtwoord niet ondersteund