PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL, przeciągnij i zamień

Przykład 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;

Przykład 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;

Jeśli masz unikalny indeks na (brkalk,brred) wtedy byłoby to bardziej skomplikowane, ponieważ podczas renumeracji pojawią się zduplikowane brred .

Ale w przypadku wielu wierszy sugerowałbym użycie czegoś, co było bardzo przydatne w czasach języka BASIC na komputerach 8-bitowych - ponumeruj wiersze lukami.

Więc zamiast:

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

użyj:

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

Wtedy Twoje przykłady będą wyglądać tak:

  • Przykład 1:update kalksad1 set brred=(2048+1024)/2 where kalk_id=43 , co zmieniłoby go na:
    (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'),
    

  • Przykład 2:update kalksad1 set brred=(4096+3072)/2 where kalk_id=43 , co zmieniłoby go na:
    (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'),
    

    Tylko wtedy, gdy nie ma przerwy między wierszami, w których powinien znajdować się cel, musisz najpierw zmienić numerację wierszy, na przykład:

    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;
    

    Byłoby to znacznie gorsze niż zmiana każdego wiersza między źródłem a celem. Ale będzie to miało znaczenie tylko wtedy, gdy może być wiele wierszy do zmiany.



    1. Database
    2.   
    3. Mysql
    4.   
    5. Oracle
    6.   
    7. Sqlserver
    8.   
    9. PostgreSQL
    10.   
    11. Access
    12.   
    13. SQLite
    14.   
    15. MariaDB
    1. Jak naprawić BŁĄD:kolumna c.relhasoids nie istnieje w Postgresie?

    2. Zapytanie SQL, aby uzyskać najnowszy wiersz dla każdego wystąpienia danego klucza

    3. Rzucanie typu NULL podczas aktualizowania wielu wierszy

    4. Konwertuj dzień juliański na datę w PostgreSQL

    5. postgresql:typ danych dla skrótu wiadomości md5?