2016-03-02 7 views
9

मैंशून्य द्वारा ऑर्डर के साथ LISTAGG वास्तव में आदेश मानदंड के रूप में उपयोग करता है?

SELECT LISTAGG(COLUMN_VALUE) WITHIN GROUP (ORDER BY NULL) AS OrderByNULL, 
     LISTAGG(COLUMN_VALUE) WITHIN GROUP (ORDER BY 1)  AS OrderByCONST, 
     LISTAGG(COLUMN_VALUE) WITHIN GROUP (ORDER BY ROWNUM) AS OrderByROWNUM 
FROM TABLE(SYS.ODCIVARCHAR2LIST('5', '222', '4')); 

करते हैं उत्पादन होता है:

ORDERBYNULL ORDERBYCONST ORDERBYROWNUM 
----------- ------------ ------------- 
222,4,5  222,4,5  5,222,4 

क्वेरी जब गैर नियतात्मक आदेश (NULL या एक निरंतर) के साथ ORDER BY का उपयोग कर एक अक्षरांकीय प्रकार किया है प्रकट होता है और बनाए रखा है ORDER BY ROWNUM (निर्धारिती) का उपयोग करते समय इनपुट ऑर्डर।

LISTAGG प्रलेखन कहा गया है कि:

order_by_clause जिस क्रम में श्रेणीबद्ध मूल्यों लौटा दिया जाता है निर्धारित करता है। फ़ंक्शन केवल तभी निर्धारित होता है जब कॉलम सूची द्वारा ऑर्डर ने अद्वितीय ऑर्डरिंग प्राप्त की हो।

और जब analytic functions को देखकर यह कहा गया है कि: [...] अन्य सभी विश्लेषणात्मक कार्यों के लिए,:

अनेक पंक्तियों के लिए समान मूल्यों में order_by_clause परिणाम, समारोह के रूप में इस प्रकार से व्यवहार करता है जब भी परिणाम विंडो विनिर्देश पर निर्भर करता है। यदि आप RANGE कीवर्ड के साथ एक तार्किक विंडो निर्दिष्ट करते हैं, तो फ़ंक्शन प्रत्येक पंक्ति के लिए एक ही परिणाम देता है। यदि आप ROWS कीवर्ड के साथ एक भौतिक विंडो निर्दिष्ट करते हैं, तो परिणाम nondeterministic है।

तो जहाँ तक मैं प्रलेखन एक गैर नियतात्मक आदेश की उम्मीद की जा रही है से बता सकते हैं - हालांकि, समारोह एक अक्षरांकीय प्रकार पर और जिस क्रम में पंक्तियों कार्रवाई की जाती है पर नहीं आधारित एक नियतात्मक उत्पादन देता है (जो commonly held view है)।

यह अन्य विश्लेषणात्मक कार्यों का व्यवहार करने के लिए अलग अलग (जब ROWS कीवर्ड के साथ एक भौतिक विंडो का उपयोग) है:

SELECT LAST_VALUE(COLUMN_VALUE) 
     OVER (ORDER BY NULL ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 
     AS BYNULL, 
     LAST_VALUE(COLUMN_VALUE) 
     OVER (ORDER BY 1  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 
     AS BYCONST, 
     LAST_VALUE(COLUMN_VALUE) 
     OVER (ORDER BY ROWNUM ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 
     AS BYROWNUM 
FROM TABLE(SYS.ODCIVARCHAR2LIST('5', '222', '4')); 

कौन सा सभी विभिन्न orderings के लिए एक सुसंगत उत्पादन देता है:

BYNULL BYCONST BYROWNUM 
------ ------- -------- 
4  4  4 
4  4  4 
4  4  4 

क्या LISTAGG पर ऑर्डरिंग लागू करने के लिए आधिकारिक दस्तावेज़ीकरण है, जो एक गैर-निर्धारक आदेश प्रदान किया जाता है?

नोट: शून्य आदेश खंड के बावजूद

इस उदाहरण में, तत्वों वर्णानुक्रम एकीकृत कर दी गई,: ORDER BY NULL के व्यवहार here बताते हुए इस पर टिप्पणी की है। अभिव्यक्ति द्वारा निरंतर ORDER का उपयोग करते समय यह डिफ़ॉल्ट व्यवहार प्रतीत होता है

लेकिन यह गैर-ओरेकल साइट पर व्यवहार पर सिर्फ एक टिप्पणी है।

+4

परिणामों का एक सेट मूल रूप से निर्धारणा के शून्य साक्ष्य प्रदान करता है। यदि आप स्थिर या 'NULL' का उपयोग करते हैं, तो परिणामों को किसी भी क्रम में उम्मीद करें। दस्तावेज़ीकरण स्पष्ट है कि आप ऑर्डरिंग पर भरोसा नहीं कर सकते हैं जब 'कुंजी द्वारा' कुंजी के समान मान होते हैं। –

+0

हालांकि, यदि आप परीक्षण (विभिन्न डेटा के साथ) दोहराते हैं तो आपको लगातार वही अल्फान्यूमेरिक ऑर्डरिंग मिल जाएगी। इस आदेश के लिए आपको सह-घटनाओं की बजाय डिज़ाइन सुविधा माना जाने के लिए कितने परिणामों की आवश्यकता है? – MT0

+2

जो कुछ भी कर रहा है वह NLS_COMP/SORT को अनदेखा करता है। संभवतः यह एक कार्यान्वयन विस्तार है। एक डिजाइन सुविधा के बजाय - और ऐसा लगता है कि एमओएस सहित दस्तावेज प्रतीत नहीं होता है। और इस तरह, ऐसा कुछ नहीं है जिस पर आप भरोसा कर सकते हैं - क्योंकि यह भविष्य में रिलीज में बदल सकता है? यह दिलचस्प है, लेकिन यह सुनिश्चित नहीं है कि यह उपयोगी है या नहीं। –

उत्तर

0

संभावित रूप से आदेश क्वेरी के निष्पादन योजना, आपके उदाहरण की कॉन्फ़िगरेशन, डेटाबेस का संस्करण, यदि आप exadata पर हैं या नहीं, तो कई कारकों पर निर्भर करेगा।

यदि आप डेटा को ऑर्डर करने के लिए किसी विशिष्ट मानदंड को ऑरैक नहीं दे रहे हैं तो आप किसी भी विशिष्ट ऑर्डरिंग पर भरोसा नहीं कर सकते हैं, भले ही आपके परीक्षणों से आपको डेटा को लगातार एक विशिष्ट तरीके से क्रमबद्ध किया जा सके।

Oracle documentation for listagg के अनुसार:

  • order_by_clause जिस क्रम में श्रेणीबद्ध मूल्यों लौटा दिया जाता है निर्धारित करता है। फ़ंक्शन केवल तभी निर्धारित होता है जब कॉलम सूची द्वारा ऑर्डर ने अद्वितीय ऑर्डरिंग प्राप्त की हो।
संबंधित मुद्दे