PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL, Drag-and-Swap

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

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

Wenn Sie einen eindeutigen Index für (brkalk,brred) haben dann wäre es komplizierter, da es während der Neunummerierung doppelte brred gibt .

Aber für viele Zeilen würde ich empfehlen, etwas zu verwenden, das in den Tagen der BASIC-Sprache auf 8-Bit-Computern sehr nützlich war - nummerieren Sie Ihre Zeilen mit Lücken.

Also statt:

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

verwenden:

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

Dann würden Ihre Beispiele einfach so aussehen:

  • Beispiel 1:update kalksad1 set brred=(2048+1024)/2 where kalk_id=43 , was es ändern würde zu:
    (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'),
    

  • Beispiel 2:update kalksad1 set brred=(4096+3072)/2 where kalk_id=43 , was es ändern würde zu:
    (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'),
    

    Nur wenn es keine Lücke zwischen den Zeilen gibt, wo das Ziel sein sollte, müssen Sie zuerst die Zeilen neu nummerieren, zum Beispiel mit:

    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;
    

    Dies wäre viel schneller, als jede Zeile zwischen Quelle und Ziel zu ändern. Dies spielt jedoch nur eine Rolle, wenn möglicherweise viele Zeilen geändert werden müssen.