क्या चयनित पंक्ति संख्याओं द्वारा क्रमबद्ध परिणामों को वापस लेने के लिए SELECT ROW_NUMBER () की गारंटी है?


10

जैसे SQL क्वेरी पर विचार करें:

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

यहां मैं ए। [नाम] द्वारा छांटे जा रहे परिणामों का निरीक्षण करता हूं। अगर मैं ROW_NUMBER फ़ंक्शन में परिभाषित सॉर्ट कॉलम को दूसरे कॉलम में बदलता हूं तो फिर से परिणाम उस कॉलम द्वारा सॉर्ट किए जाते हैं।

मैं उम्मीद कर रहा था कि पंक्ति संख्या पंक्तियों को सौंपी जाएगी लेकिन मैं उम्मीद नहीं कर रहा था कि पंक्तियाँ उसी मानदंड के आधार पर छंटनी करेंगी। क्या यह केवल एक साइड इफेक्ट है कि क्वेरी को कैसे निष्पादित किया जा रहा है (SQL Server 2008 R2 पर मेरे मामले में) या क्या इस व्यवहार की गारंटी है? (मुझे इस तरह की गारंटी का कोई संदर्भ नहीं मिला)।


10
कभी कोई गारंटी नहीं है। कभी। जब तक आप SQL सर्वर को कुछ ऑर्डर करने का तरीका नहीं बताते हैं, तब तक वह जिस भी ऑर्डर में चाहे, डेटा वापस कर सकता है। आदेश को छोड़ कर, आप SQL सर्वर को बता रहे हैं कि आपको आदेश की परवाह नहीं है। यदि आप एक गारंटी चाहते हैं, तो पहले से ही ORDER BY क्लॉज टाइप करें।
एरॉन बर्ट्रेंड

प्रश्न के क्रम-क्रम खंड के रूप में पूछने का एक अच्छा कारण बहुत जटिल है और इसलिए प्रतिलिपि बनाना दोनों कोड रखरखाव गिट्टी के साथ-साथ भविष्य के दोषों की संभावना को बढ़ाता है। अन्य विकल्प एक मामूली रीफैक्टरिंग है जिसे मैंने सोचा था कि अगर एसक्यूएल मानक एक अंतर्निहित क्रम को परिभाषित करता है तो मैं इससे बचने में सक्षम हो सकता हूं। किसी भी मामले में मुझे सिर्फ दिलचस्पी थी अगर इस बिंदु को कवर करने वाले औपचारिक दस्तावेज थे।
redcalx

1
तो यह सवाल क्यों नहीं पूछा?
आरोन बर्ट्रेंड

जवाबों:


14

यदि आपने प्रश्न पूछा था तो मुझे लगता है कि आप वास्तव में पूछना चाहते हैं:

मैं ROW_NUMBER()जटिल ORDER BYअभिव्यक्ति को दोहराए बिना कैसे आदेश दे सकता हूं ?

हम आपको ROW_NUMBER()अभिव्यक्ति के लिए एक उपनाम बनाने के लिए कह सकते हैं , और फिर उपनाम का उपयोग करके सॉर्ट करें:

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

अब आपको केवल एक ही स्थान पर अभिव्यक्ति को बदलना होगा, और परिणामी क्रम उस अभिव्यक्ति पर आधारित होगा, बिना इसे दोहराए।


6
वास्तव में, repeating the complex ORDER BY expressionयह भी गारंटी नहीं है कि आउटपुट ROW_NUMBER () के आदेश से निकलेगा। जब तक ORDER BY क्लॉज में कॉलम एक अद्वितीय कुंजी नहीं बनाता।
दोपहर 12:54

22

बिलकुल नहीं। सबूत:

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

SQL में ऑर्डर की गारंटी देने का एकमात्र तरीका इसके लिए पूछना है, ORDER BYपरिणाम पर ही उपयोग करें ।


ठीक है, मैं एक और योग्यता जोड़ूंगा - क्या केवल एक ROW_NUMBER () क्लॉज निर्दिष्ट किए जाने पर परिणाम की गारंटी दी जाएगी।
redcalx

22
एसक्यूएल में एक आदेश की गारंटी देने का एकमात्र तरीका इसके लिए पूछना है
रेमस रुसानु

0

वास्तव में (पुराने) प्रश्न को भाग द्वारा भी शामिल किया जा सकता है , क्योंकि पहले विभाजन से एक अंतर्निहित आदेश और फिर भाग द्वारा आदेश लगता है।

इसलिए यह उतना सरल नहीं है जितना कि कुछ ने row_number को असाइन करने और ऑर्डर करने के लिए उपयोग करने का सुझाव दिया है।

हमें क्लॉज द्वारा विभाजन को निकालने के लिए एक नेस्टेड sql की आवश्यकता होगी (यदि हम केवल इसे दोहराना नहीं चाहते हैं)

आनुभविक रूप से हमें आदेश देने की अंतिम पंक्ति निहित प्रतीत होती है

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

लेकिन हमारे पास जो कमी है, वह कोई सबूत या गारंटी नहीं है कि यह हमेशा मौजूद रहे।

(यदि कई रो_नंबर हैं () प्ले में कॉल करते हैं, तो यह सबसे आखिरी है जो ऑर्डर देने के लिए लगता है)

यदि आप स्पष्ट रूप से निष्पादन योजना द्वारा आदेश को स्पष्ट रूप से जोड़ते हैं, तो भी नोट करें, एक अंतिम सॉर्ट-स्टेप दिखाता है, और पहले से सॉर्ट किया गया सेट सॉर्ट करना सबसे खराब स्थिति है, इसलिए ऑर्डर के बिना इसे अधिक समय लगता है।


1
यह वास्तव में सवाल का जवाब नहीं देता है, और यह स्वीकार किए जाते हैं दोनों जवाब से सहमत नहीं है, और एक अत्यधिक उत्कट उत्तर।
एरिक डार्लिंग

मैं इस बात से सहमत हूं कि मेरा एक जवाब से ज्यादा एक टिप्पणी है। अच्छी तरह से स्वीकार किए गए उत्तर वास्तव में एक जवाब नहीं है, सिवाय इसके कि हम बेहतर आदेश पर भरोसा नहीं करते हैं - और यही सवाल था। निष्पादन योजना द्वारा यह देखा जा सकता है कि यह वास्तव में एक प्रकार है, और यदि हम एक स्पष्ट क्रम जोड़ते हैं, तो हमें दूसरा प्रकार मिलता है। लेकिन यह एक प्रमाण नहीं है, यह अनुभवजन्य ज्ञान का हिस्सा है
Eske Rahn

(बेशक यह केवल उस प्रकार का होता है यदि कोई उपयुक्त अनुक्रमणिका नहीं है जिसका उपयोग वह तालिका तक पहुंचने के लिए कर सकता है, लेकिन केवल यह दिखाने के लिए कि वह आम तौर पर लागत को स्पष्ट रूप से आदेश देने के लिए स्वतंत्र नहीं है)
Eske Rahn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.