अधिकांश डेटाबेस इस तथ्य के बारे में काफी स्पष्ट हैं कि ORDER BY
एक उपश्रेणी में या तो है:
- अनुमति नहीं: उदाहरण के लिए SQL सर्वर, Sybase SQL कहीं भी (जब तक
TOP
या साथ पूरक नहीं है OFFSET .. FETCH
)
- अर्थहीन: उदाहरण के लिए PostgreSQL, DB2 (फिर से, जब तक कि साथ पूरक
OFFSET .. FETCH
या न हो LIMIT
)
यहाँ DB2 LUW मैनुअल (जोर मेरा) से एक उदाहरण है
एक आदेश में एक खंड द्वारा खंड एक क्वेरी द्वारा लौटाए गए पंक्तियों के क्रम को प्रभावित नहीं करता है । एक आदेश द्वारा खंड केवल पंक्तियों के क्रम को प्रभावित करता है अगर यह बाहरी पूर्णता में निर्दिष्ट है।
शब्दांकन बिल्कुल स्पष्ट है, बिल्कुल PostgreSQL की तरह :
यदि छंटाई को नहीं चुना गया है, तो पंक्तियों को अनिर्दिष्ट क्रम में वापस कर दिया जाएगा। उस मामले में वास्तविक आदेश स्कैन पर निर्भर करेगा और डिस्क पर योजना प्रकार और आदेश में शामिल हो जाएगा , लेकिन यह निर्भर नहीं होना चाहिए । एक विशेष आउटपुट ऑर्डरिंग की गारंटी केवल तभी दी जा सकती है जब सॉर्ट स्टेप स्पष्ट रूप से चुना गया हो।
इस विनिर्देशन से, यह अनुसरण किया जा सकता है कि ORDER BY
व्युत्पन्न तालिका में खंड से उत्पन्न कोई भी आदेश केवल आकस्मिक है और संयोगवश आपकी अपेक्षित ऑर्डर से मेल खा सकता है (जो यह आपके तुच्छ उदाहरण में अधिकांश डेटाबेस में करता है), लेकिन इस पर भरोसा करना नासमझी होगी। यह।
साइड नोट DB2 पर:
विशेष रूप से, DB2 में कम ज्ञात विशेषता हैORDER BY ORDER OF <table-designator>
, जिसे निम्नानुसार उपयोग किया जा सकता है:
SELECT C1 FROM
(SELECT C1 FROM T1
UNION
SELECT C1 FROM T2
ORDER BY C1 ) AS UTABLE
ORDER BY ORDER OF UTABLE
इस विशेष मामले में, व्युत्पन्न तालिका के आदेश को स्पष्ट रूप से बाहरी सबसे अधिक चयन में फिर से उपयोग किया जा सकता है
ओरेकल पर साइड नोट:
वर्षों से यह ओरेकल में प्रचलन को लागू करने के लिए प्रचलन में OFFSET
रहा है ROWNUM
, जिसकी गणना एक व्युत्पन्न तालिका के आदेश के बाद ही की जा सकती है :
SELECT *
FROM (
SELECT rownum AS rn, t.* -- ROWNUM here depends on the derived table's ordering
FROM (
SELECT * FROM table ORDER BY time DESC
) t
) t
WHERE rn BETWEEN 10 AND 20
यह उचित रूप से उम्मीद की जा सकती है कि कम से कम ROWNUM
एक क्वेरी की उपस्थिति में , भविष्य के ओरेकल संस्करण इस व्यवहार को नहीं तोड़ेंगे ताकि सभी विरासत ऑरेकल एसक्यूएल को बहुत अधिक न तोड़ें, जो अभी तक बहुत अधिक वांछित नहीं है और पठनीय SQL मानक OFFSET .. FETCH
वाक्यविन्यास:
SELECT * FROM table ORDER BY time DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY