2010-01-20 8 views
9

में अनुमत क्लॉज द्वारा ऑर्डर किया गया है क्या कोई कारण है कि आपको सबक्वायरी में 'ऑर्डर बाय' क्यों करना चाहिए?एक सबक्वायरी

उत्तर

12

हां: ऐसा नहीं किया जाना चाहिए, क्योंकि यह अवधारणा को समझ में नहीं आता है।

सबक्वायरी का उपयोग कुछ बाहरी क्वेरी में किया जाएगा (अन्यथा यह व्यर्थ होगा), और बाहरी क्वेरी को वैसे भी ऑर्डर करना होगा, इसलिए सबक्वायरी को ऑर्डर करने का कोई मतलब नहीं है।

ऐसा इसलिए है क्योंकि एसक्यूएल में क्वेरी परिणाम किसी विशेष क्रम में नहीं आते हैं, जब तक आप एक स्पष्ट ऑर्डर का उपयोग नहीं करते। इसलिए यदि आपने उप-वर्ग में ऑर्डर का उपयोग किया है, तो आपको कोई गारंटी नहीं है कि इससे बाहरी क्वेरी के परिणामों के क्रम को प्रभावित किया जाएगा; तो यह व्यर्थ है।

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

संपादित करें: बेशक, यदि आप सबक्वेरी में टॉप या सीमा का उपयोग, आप जाएगा आदेश का उपयोग करने की जरूरत है। लेकिन यह मानक एसक्यूएल वैसे भी नहीं है ...

11

यदि उपकुमारी LIMIT/TOP का उपयोग करता है तो आपको इसका उपयोग करना चाहिए।

SQL Server यह अनुमति देगा जब तक सबक्वेरी रूप में अच्छी तरह TOP या FOR XML खंड शामिल हैं:

-- Fails 
WITH q(id) AS 
     (
     SELECT 1 
     UNION ALL 
     SELECT 2 
     ) 
SELECT * 
FROM (
     SELECT * 
     FROM q 
     ORDER BY 
       id DESC 
     ) q2 

-- Succeeds 
WITH q(id) AS 
     (
     SELECT 1 
     UNION ALL 
     SELECT 2 
     ) 
SELECT * 
FROM (
     SELECT TOP 1 * 
     FROM q 
     ORDER BY 
       id DESC 
     ) q2 

-- Succeeds, but ORDER BY is ignored 
WITH q(id) AS 
     (
     SELECT 1 
     UNION ALL 
     SELECT 2 
     ) 
SELECT * 
FROM (
     SELECT TOP 100 PERCENT * 
     FROM q 
     ORDER BY 
       id DESC 
     ) q2 
1

तुम कर सकते हो, लेकिन मैं नहीं आमतौर पर जब तक आप एक की जरूरत होगी।

अनुकूलक कुछ उपयोगों के लिए यह ध्यान नहीं देगा (या फेंक एक त्रुटि?)

देखें "Intermediate materialisation"।

1

उप-क्वेरी के आकार के आधार पर, यह एक भिन्न डिग्री के प्रदर्शन को प्रभावित करेगा।

आदेश उप-क्वेरी पर कोई फर्क नहीं पड़ता है। आप बाहरी क्वेरी में ऑर्डर द्वारा ऑर्डर को स्थानांतरित करने में सक्षम होना चाहिए (जो अंतिम परिणाम लौटने वाला होना चाहिए)।

-3

यह पूरी तरह से कानूनी है। अर्थात। SELECT id FROM entries WHERE author_id IN (SELECT id FROM authors ORDER BY name DESC) लेकिन आपको आमतौर पर वही परिणाम मिलेंगे।

+0

आमतौर पर? क्या आप कोई मामला दे सकते हैं जहां परिणाम अलग होंगे? – sleske

+0

यदि आप अपने उप-चयन में कोई LIMIT स्टेटमेंट जोड़ते हैं तो यह अलग होगा। इस मामले में, यदि आप शीर्ष 5 लेखकों के नाम से सभी प्रविष्टियों को देखना चाहते हैं, तो आप अपना उप-चयन बदल देंगे (लेखकों से ऑर्डर डीईएससी लिमिटेड 5 द्वारा ऑर्डर करें)। – loginx

+0

सच है। टॉप/एलआईटी के साथ यह एक फर्क पड़ता है (और आवश्यक है, कभी-कभी भी आवश्यक)। अन्यथा, यह कोई फर्क नहीं पड़ता है। – sleske

3

आप शीर्ष का उपयोग जब तक यह उपयोगी नहीं है जब से तुम बाहरी क्वेरी में आदेश देने की जाएगी वैसे भी

1

कोई आदेश द्वारा एक सबक्वेरी जब तुम समग्र डेटा के एक उपसमूह में रुचि रखते हैं में मान्य है, इसलिए आप हमेशा की जरूरत है एक TOP (एसक्यूएल सर्वर)। उपरोक्त में शीर्ष के बिना ऑर्डर करने का कोई मतलब नहीं है क्योंकि परिणाम की समग्र क्रम बाहरी क्वेरी द्वारा संभाली जाती है।

1

आपको इसका उपयोग नहीं करना चाहिए। 'आर्ट ऑफ एसक्यूएल' के मुताबिक, यह वास्तव में ऑप्टिमाइज़र को विभिन्न अनुकूलन करने से रोकता है जो अन्यथा ऐसा कर सकता है क्योंकि यह डेटा को पूर्व-परिपक्व रूप से बदल देता है।

2

स्मार्ट लोग कहते हैं कि ऐसा करने के लिए उचित/वैध तरीका नहीं है। मेरे मामले में उप-क्वेरी में शीर्ष 100 PERCENT चुनें समस्या हल हो गई।

चीयर्स