PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL, kéo và hoán đổi

Ví dụ 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;

Ví dụ 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;

Nếu bạn có chỉ mục duy nhất trên (brkalk,brred) thì nó sẽ phức tạp hơn, vì trong quá trình đánh số lại sẽ có brred trùng lặp .

Nhưng đối với nhiều hàng, tôi khuyên bạn nên sử dụng thứ gì đó rất hữu ích trong thời kỳ ngôn ngữ BASIC trên máy tính 8bit - hãy đánh số các hàng của bạn bằng khoảng trống.

Vì vậy, thay vì:

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

sử dụng:

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

Sau đó, các ví dụ của bạn sẽ giống như sau:

  • Ví dụ 1:update kalksad1 set brred=(2048+1024)/2 where kalk_id=43 , sẽ thay đổi nó thành:
    (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'),
    

  • Ví dụ 2:update kalksad1 set brred=(4096+3072)/2 where kalk_id=43 , sẽ thay đổi nó thành:
    (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'),
    

    Chỉ khi không có khoảng cách giữa các hàng mà mục tiêu sẽ nằm, trước tiên bạn cần đánh số lại các hàng bằng cách sử dụng ví dụ:

    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;
    

    Điều này sẽ hữu ích hơn nhiều so với việc thay đổi mọi hàng giữa nguồn và đích. Nhưng điều này sẽ chỉ quan trọng khi có thể có nhiều hàng cần thay đổi.



    1. Database
    2.   
    3. Mysql
    4.   
    5. Oracle
    6.   
    7. Sqlserver
    8.   
    9. PostgreSQL
    10.   
    11. Access
    12.   
    13. SQLite
    14.   
    15. MariaDB
    1. không có mục nhập pg_hba.conf cho máy chủ

    2. Rails Migrations:đã cố gắng thay đổi loại cột từ chuỗi thành số nguyên

    3. Tên Ràng buộc Mặc định trong PostgreSQL là gì?

    4. Postgresql DROP TABLE không hoạt động

    5. CẬP NHẬT với ORDER BY