2009-05-12 4 views
10

क्यों निम्न क्वेरी वापसी 'शून्य' रिकॉर्ड:ओरेकल/एसक्यूएल: क्यों क्वेरी करता है "रिकॉर्ड कहां ROWNUM> = 5 और ROWNUM <= 10 से * का चयन करें" - वापसी शून्य पंक्तियां

 
SELECT * FROM records WHERE rownum >= 5 AND rownum <= 10 

    OR 

SELECT * FROM records WHERE rownum >= 5 

जबकि निम्न क्वेरी वापसी उचित रिकॉर्ड:

 
SELECT * FROM records WHERE rownum <= 15 

सादर,
- आशीष

+0

आप संपूर्ण क्वेरी से <= rownum क्वेरी के परिणामों को घटाने के लिए हमेशा एक ऋण का उपयोग कर सकते हैं। –

उत्तर

32

ओरेकल में, ROWNUM मूल्यों क्वेरी को छानने चरण के बाद आवंटित कर रहे हैं - वे तालिका की पंक्तियां नहीं हैं, वे क्वेरी परिणाम सेट की पंक्तियां हैं।

तो पहली पंक्ति है कि वापस आता है हमेशा ROWNUM 1, दूसरी पंक्ति है कि वापस ROWNUM 2 आता है, आदि दिया जाएगा

के बाद उसके असाइन ROWNUM मूल्य केवल वृद्धि की जाती है,

की तरह तो किसी भी प्रश्न
select * from t where ROWNUM > 1 

कभी भी कोई परिणाम नहीं लौटाएगा। यह सवाल कहता है, 'मैं पहली पंक्ति को देखना नहीं चाहता जो मेरे पास वापस आती है, केवल उसके बाद ही' जो एक विरोधाभास को हल करती है, इसलिए कुछ भी वापस नहीं आ जाता है। अधिक जानकारी के लिए

Ask Tom:On ROWNUM and Limiting Results देखें।

+0

क्या एक बड़ी क्वेरी के भीतर एक सबक्वायरी के राउनम तक पहुंच बनाना संभव है? मुझे संदेह है कि मूल प्रश्न क्या हो सकता है। –

+0

आह, मैं टॉम को बताता हूं कि आपके द्वारा लिंक किए गए आलेख में, "ROWNUM के साथ अंकन" अनुभाग में। महान लिंक! –

+0

हम्म !! और मैंने सोचा कि मैं रिकॉर्ड्स के किसी भी सबसेट को फ़िल्टर करने के लिए 'राउनम' का उपयोग कर सकता हूं। यह एक वास्तविक विस्तृत और सूचनात्मक उत्तर था - आपकी मदद के लिए धन्यवाद 'कोडूलिक'। – Vini

1

ROWNUM एक छद्म चिह्न है और यह मान क्वेरी निष्पादन के समय उपलब्ध नहीं होगा। तो आप इस कॉलम के आधार पर अपने परिणामों को फ़िल्टर नहीं कर सकते हैं। इसके साथ ही, इसे कम करने के लिए आसपास के काम हैं। कृपया नीचे देखें (यदि आपका परिणाम बहुत बड़ा है तो इसका उपयोग करने की अनुशंसा नहीं की जाती है)।

Select a.* From 
(
    Select COL1, COL2, ROWNUM RowNumber From MyTable 
) a 
Where 
    RowNumber = 5; 
1

वैकल्पिक MINUS

SELECT * FROM records 
WHERE ROWNUM <= 10 
minus SELECT * FROM records 
WHERE ROWNUM <= 5 

उपयोग करने के लिए इस गैर अनन्य मानों को फ़िल्टर कर देगा ताकि आप बेहतर आईडी का चयन होना है।

आशा है कि यह आपको कुछ समय बचाएगा।

संबंधित मुद्दे