sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL, dra och byt

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

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

Om du har unikt index på (brkalk,brred) då skulle det vara mer komplicerat, eftersom det vid omnumrering kommer att finnas dubbletter av brred .

Men för många rader skulle jag rekommendera att använda något som var mycket användbart under BASIC-språkets dagar på 8-bitars datorer - numrera dina rader med luckor.

Så istället för:

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

använd:

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

Då skulle dina exempel bara se ut så här:

  • Exempel 1:update kalksad1 set brred=(2048+1024)/2 where kalk_id=43 , vilket skulle ändra det till:
    (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'),
    

  • Exempel 2:update kalksad1 set brred=(4096+3072)/2 where kalk_id=43 , vilket skulle ändra det till:
    (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'),
    

    Endast när det inte finns något mellanrum mellan raderna där målet ska vara, måste du först numrera om raderna med till exempel:

    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;
    

    Detta skulle vara mycket aster än att ändra varje rad mellan källa och mål. Men det här spelar bara roll när det kan finnas många rader att ändra.



    1. Hur man hittar ASCII-koden för en given karaktär i MySQL

    2. finns det en PRODUKT-funktion som det finns en SUM-funktion i Oracle SQL?

    3. Finns det någon boolesk typ i Oracle-databaser?

    4. Deklarera tupelstrukturen för en post i PL/pgSQL