SELECT ROW_NUMBER () öğesinin oluşturulan satır numaralarına göre sıralanmış sonuçları döndürmesi garanti ediliyor mu?


10

Örneğin SQL sorgusunu düşünün:

SELECT
   A.[Name],
   ROW_NUMBER() OVER(ORDER BY A.[Name] ASC)
FROM
   [FooTable] AS A

Burada sonuçların A. [Ad] 'a göre sıralandığını gözlemliyorum. ROW_NUMBER işlevinde tanımlanan sıralama sütununu başka bir sütuna değiştirirsem, sonuçlar yine o sütuna göre sıralanır.

Satır numarasının satırlara atanmasını bekliyordum ama satırların aynı ölçütlere göre sıralanmış olarak geri dönmesini beklemiyordum. Bu, yalnızca sorgunun yürütülme biçiminin bir yan etkisi mi (benim durumumda SQL Server 2008 R2'de) veya bu davranış garanti ediliyor mu? (Böyle bir garantiye referans bulamadım).


10
Asla herhangi bir garanti yoktur. Hiç. SQL Server'a bir şeyin nasıl sipariş edileceğini söylemediğiniz sürece, verileri istediği sırayla döndürmek ücretsizdir. Siparişi bırakarak, SQL Server'a siparişle ilgilenmediğinizi söylüyorsunuz. Bir garanti istiyorsanız, ORDER BY yan tümcesini yazmanız yeterlidir.
Aaron Bertrand

Söz konusu sipariş cümlesinin çok karmaşık olduğunu sormak için iyi bir neden vardır ve bu nedenle kopyalama hem kod bakım balastını hem de gelecekteki hataların olasılığını arttırır. Diğer alternatif, SQL standardı örtük bir sıralama düzeni tanımladığında kaçınabileceğimi düşündüğüm küçük bir yeniden düzenleme. Her halükarda, sadece bu noktayı kapsayan resmi belgeler olup olmadığını merak ettim.
redcalx

1
neden bu soruyu sormuyorsun?
Aaron Bertrand

Yanıtlar:


14

Soruyu sormuş olsaydınız, aslında sormak istediğinizi düşünüyorum:

ROW_NUMBER()Karmaşık ORDER BYifadeyi tekrar etmeden nasıl sipariş verebilirim ?

Size ROW_NUMBER()ifade için bir takma ad oluşturmanızı ve ardından takma adı kullanarak sıralamanızı söyleyebilirdik :

SELECT
   A.[Name],
   rn = ROW_NUMBER() OVER (ORDER BY <complex expression>)
FROM
   dbo.[FooTable] AS A
ORDER BY rn;

Şimdi ifadeyi yalnızca tek bir yerde değiştirmeniz gerekir ve sonuçta elde edilen sıralama, tekrar etmek zorunda kalmadan bu ifadeye dayalı olacaktır.


6
Aslında, repeating the complex ORDER BY expressionçıktının ROW_NUMBER () emriyle çıkacağını garanti etmez. ORDER BY deyimindeki sütunlar benzersiz bir anahtar oluşturmadıkça.
孔夫子

22

Kesinlikle hayır. Kanıt:

SELECT
   A.[Name],
   ROW_NUMBER() OVER(ORDER BY A.[Name] ASC),
   ROW_NUMBER() OVER(ORDER BY A.[Name] DESC)
FROM
   [FooTable] AS A

SQL'de bir siparişi garanti etmenin tek yolu, bunu istemek ORDER BY, sonucun kendisini kullanmaktır.


Tamam Bir yeterlilik daha ekleyeceğim - yalnızca bir ROW_NUMBER () yantümcesi belirtilirse sıralanacağı garanti edilen sonuçlar.
redcalx

22
SQL'de bir siparişi garanti etmenin tek yolu bunu istemektir
Remus Rusanu 23:12

0

Aslında (eski) soru, bölümü bölümler de içerecek şekilde genişletilebilir , çünkü önce bölüm tarafından sonra da bölüm (ler) tarafından örtük bir emir var gibi görünüyor

Bu nedenle, bazılarının row_number ataması ve bunu sipariş için kullanması önerdiği kadar basit değildir.

Bölme yan tümcesiyle ayıklanan iç içe bir sql'ye ihtiyacımız olurdu (eğer elbette tekrarlamak istemiyorsak)

Ampirik olarak , siparişin son satırını dolaylı olarak alıyor gibi görünüyoruz

Select
  <field-list>, 
  rn=Row_Number() over(partition by <PartionClause>) order by <OrderClause>
from ....
Order by <PartionClause> asc, rn asc

Ancak eksik olduğumuz şey, her zaman sahip olduğu herhangi bir kanıt veya garantidir.

(Oyunda birden fazla Row_Number () çağrısı varsa, sıralamayı veriyor gibi görünen SON)

AYRICA NOT açıkça eklerseniz tarafından sipariş açıkça nihai sıralama adım gösterir ve bir zaten sıralanmış dizi sıralama tür kötü davanın olan yürütme planı, dolayısıyla onunla ölçüde daha uzun sürer al By olmadan daha


1
Bu soruya gerçekten cevap vermiyor ve hem kabul edilen cevapla hem de son derece onaylanmış bir cevapla aynı fikirde değil gibi görünüyor.
Erik Darling

Benimkinin bir cevaptan çok bir yorum olduğuna katılıyorum. Kabul edilen cevap gerçekten bir cevap değildir, ancak düzene güvenmememiz gerektiğini söylüyor - ve soru buydu. Yürütme planı tarafından gerçekten bir sıralama yaptığı görülebilir ve açık bir sipariş eklersek, ikinci bir sıralama elde ederiz. Ama bu bir kanıt DEĞİL, ampirik bilginin sadece bir parçası
Eske Rahn

(Tabii ki sadece tabloya erişmek için kullanabileceği uygun bir dizin yoksa, ancak sadece açık bir şekilde sipariş vermenin genellikle ücretsiz olmadığını göstermek için ekledi)
Eske Rahn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.