, çizgisinde bir şey:
SELECT my_first_column, my_second_column,
ROW_NUMBER() OVER (ORDER BY my_order_column) AS Row_Counter
FROM my_table
Ancak ROW_NUMBER() OVER (ORDER BY ...)
yapı sadece Row_Counter
değerlerini belirleyen dikkat etmek önemlidir, öyle sonuçlarının sırasını garanti etmez.
'un kendisi bir ORDER BY
belirtecine sahip olmadıkça, SQL Server'ın sorguyu optimize etmeye nasıl karar verdiğine bağlı olarak sonuçlar herhangi bir sırayla iade edilebilir. (. See this article for more info)
sonuç hepRow_Counter
amacıyla iade edileceğini garanti etmenin tek yolu hem SELECT
için tam olarak aynı sıralamayı uygulamaktır ve ROW_NUMBER()
:
SELECT my_first_column, my_second_column,
ROW_NUMBER() OVER (ORDER BY my_order_column) AS Row_Counter
FROM my_table
ORDER BY my_order_column -- exact copy of the ordering used for Row_Counter
yukarıdaki desen her zaman doğru sırayla sonuçları döndürür ve basit sorgular için iyi çalışır, ancak ORDER BY
maddesinde belki de düzinelerce ifade ile "rasgele karmaşık" bir sorgu hakkında ne? iç içe sorgu kullanma
SELECT t.*
FROM
(
SELECT my_first_column, my_second_column,
ROW_NUMBER() OVER (ORDER BY ...) AS Row_Counter -- complex ordering
FROM my_table
) AS t
ORDER BY t.Row_Counter
az dağınıklığı ve daha kolay bakım anlamına karmaşık ORDER BY
maddesini, çoğaltmak gerek yok anlamına gelir: Bu tür durumlarda ben şöyle bir şey yerine tercih ederim. Dış ORDER BY t.Row_Counter
ayrıca sorgulama amacınızı diğer geliştiricilerinize daha açık hale getirir.
İç içe geçmiş sorgu neden? ROW_NUMBER() hızlı testim ile sonuçta oluşan sorgu zaten satır sayacı değerine göre sıralandı. – andynormancx
Yukarıdaki iç içe geçmiş sorgu gereksizdir, ancak bazen "SELECT t. * FROM (...)" yazısını t.Row_Counter 20 ve 30 BEWEEN olarak sayfa verilerinin etkili bir yolu olarak yazmak için yararlı olabilir. – Juliet
İç içe geçmiş sorgu *, * sonuçların her zaman "rasgele karmaşık" sorgular için Row_Counter düzeninde döndürüleceğini garanti etmek istiyorsanız gereklidir. (Daha fazla bilgi için bkz. Http://blogs.msdn.com/queryoptteam/archive/2006/05/02/588731.aspx.) – LukeH