उदाहरण 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;
उदाहरण 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;
यदि आपके पास (brkalk,brred)
. पर अद्वितीय अनुक्रमणिका है तो यह अधिक जटिल होगा, क्योंकि पुन:क्रमांकन के दौरान डुप्लिकेट होंगे brred
।
लेकिन कई पंक्तियों के लिए मैं कुछ ऐसा उपयोग करने की अनुशंसा करता हूं जो 8 बिट कंप्यूटरों पर बेसिक भाषा के दिनों में बहुत उपयोगी था - अंतराल के साथ अपनी पंक्तियों की संख्या।
तो इसके बजाय:
(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'),
उपयोग करें:
(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'),
तब आपके उदाहरण कुछ इस तरह दिखाई देंगे:
update kalksad1 set brred=(2048+1024)/2 where kalk_id=43
, जो इसे बदल देगा:(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
, जो इसे बदल देगा:(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'),
केवल जब उन पंक्तियों के बीच कोई अंतर न हो जहां लक्ष्य होना चाहिए, तो आपको पहले उदाहरण के लिए पंक्तियों को फिर से क्रमांकित करना होगा:
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;
यह स्रोत और लक्ष्य के बीच प्रत्येक पंक्ति को बदलने से कहीं अधिक तेज होगा। लेकिन यह तभी मायने रखता है जब बदलने के लिए कई पंक्तियाँ हों।