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:
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'),
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.