PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL, trascina e scambia

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

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

Se hai un indice univoco su (brkalk,brred) allora sarebbe più complicato, poiché durante la rinumerazione ci saranno brred duplicati .

Ma per molte righe consiglierei di usare qualcosa che era molto utile ai tempi del linguaggio BASIC sui computer a 8 bit:numera le righe con gli spazi vuoti.

Quindi invece di:

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

usa:

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

Quindi i tuoi esempi sarebbero semplicemente simili a:

  • Esempio 1:update kalksad1 set brred=(2048+1024)/2 where kalk_id=43 , che lo cambierebbe 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'),
    

  • Esempio 2:update kalksad1 set brred=(4096+3072)/2 where kalk_id=43 , che lo cambierebbe 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'),
    

    Solo quando non c'è spazio tra le righe dove dovrebbe essere la destinazione, dovresti prima rinumerare le righe usando ad esempio:

    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;
    

    Questo sarebbe molto più avanzato rispetto alla modifica di ogni riga tra origine e destinazione. Ma questo avrà importanza solo quando potrebbero esserci molte righe da modificare.