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

PostgreSQL, træk og skift

Eksempel 1:

opdater kalksad1 sæt brred=_brredfrom ( vælg row_number() over (rækkefølge efter brred<2 desc, brred=4 desc, brred>=2 desc, brred ) som _brred, kalk_id som _kalk_id fra kalksad1 hvor brkalk=2 bestilles efter _kalk_id) som _hvor kalk_id=_kalk_id og brred!=_brred; 

Eksempel 2:

opdater kalksad1 sæt brred=_brredfrom ( vælg row_number() over (rækkefølge efter brred<4 desc, brred!=1 desc, brred>=4 desc, brred ) som _brred, kalk_id som _kalk_id fra kalksad1 hvor brkalk =2 bestil efter _kalk_id) som _hvor kalk_id=_kalk_id og brred!=_brred; 

Hvis du har et unikt indeks på (brkalk,brred) så ville det være mere kompliceret, da der under omnummerering vil være dobbelt brred .

Men for mange rækker vil jeg anbefale at bruge noget, som var meget nyttigt i dage med BASIC sprog på 8bit computere - nummer dine rækker med mellemrum.

Så i stedet for:

(26, 2, 1, 'tekstindeks 26 dok 2 række 1'),(30, 2, 2, 'tekstindeks 30 dok. 2 række 2'),(42, 2, 3, ' tekstindeks 42 dok 2 række 3'),(43, 2, 4, 'tekstindeks 43 dok 2 række 4'),(12, 2, 5, 'tekstindeks 12 dok. 2 række 5'),

brug:

(26, 2, 1024, 'tekstindeks 26 dok 2 række 1'),(30, 2, 2048, 'tekstindeks 30 dok. 2 række 2'),(42, 2, 3072, ' tekstindeks 42 dok 2 række 3'),(43, 2, 4096, 'tekstindeks 43 dok 2 række 4'),(12, 2, 5120, 'tekstindeks 12 dok. 2 række 5'),

Så ville dine eksempler bare se sådan ud:

  • Eksempel 1:opdater kalksad1 set brred=(2048+1024)/2 hvor kalk_id=43 , hvilket ville ændre det til:
    (26, 2, 1024, 'tekstindeks 26 dok 2 række 1'),(43, 2, 1536, 'tekstindeks 43 dok. 2 række 4'),(30, 2 , 2048, 'tekstindeks 30 dok 2 række 2'),(42, 2, 3072, 'tekstindeks 42 dok. 2 række 3'),(12, 2, 5120, 'tekstindeks 12 dok. 2 række 5'), 

  • Eksempel 2:opdater kalksad1 set brred=(4096+3072)/2 hvor kalk_id=43 , hvilket ville ændre det til:
    (30, 2, 2048, 'tekstindeks 30 dok 2 række 2'),(42, 2, 3072, 'tekstindeks 42 dok. 2 række 3'),(26, 2 , 3584, 'tekstindeks 26 dok 2 række 1'),(43, 2, 4096, 'tekstindeks 43 dok. 2 række 4'),(12, 2, 5120, 'tekstindeks 12 dok. 2 række 5'), 

    Kun når der ikke er et mellemrum mellem rækkerne, hvor målet skal være, skal du først omnummerere rækkerne ved at bruge f.eks.:

    opdater kalksad1 sæt brred=_brred*1024from ( vælg row_number() over (rækkefølge efter brred) som _brred, kalk_id som _kalk_id fra kalksad1 hvor brkalk=2 order by _brred desc) as _where kalk_id=_kalk_id; kode> 

    Dette ville være meget dårligere end at ændre hver række mellem kilde og mål. Men dette har kun betydning, når der kan være mange rækker at ændre.



    1. Oracle Analytic-funktioner - nulstilling af en vinduesklausul

    2. MINUTE() Eksempler – MySQL

    3. Kan nogen forklare, hvad MERGE-erklæringen virkelig gør i Oracle?

    4. Kunne ikke indlæse sql-moduler i databaseklyngen under PostgreSQL-installationen