2009-05-25 7 views
5

मैं एक विशेष क्रम में एक परिणाम तालिका मिल रहा तरहक्या मुझे SQL परिणाम तालिका में रिकॉर्ड की स्थिति मिल सकती है?

SELECT * FROM mytable ORDER BY mycolumn ASC; 

कुछ करना है।

क्या पीके को कुशलता से पता लगाने के लिए एसक्यूएल में कोई तरीका है, उस परिणाम तालिका में किस स्थिति में मेरे पीके के साथ रिकॉर्ड होगा?

उत्तर

16

डेटाबेस है कि यह समर्थन पर, आप इस उद्देश्य के लिए ROW_NUMBER() इस्तेमाल कर सकते हैं:

SELECT RowNr 
FROM (
    SELECT 
     ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr, 
     mycolumn 
    FROM mytable 
) sub 
WHERE sub.mycolumn = 42 

उदाहरण मानता है आप के लिए प्राथमिक कुंजी 42 :)

सबक्वेरी देख रहे हैं आवश्यक है, क्योंकि कुछ जैसे:

SELECT 
    ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr 
FROM mytable 
WHERE sub.mycolumn = 42 

हमेशा 1 लौटाएगा; ROW_NUMBER() WHERE के बाद काम करता है, इसलिए बोलने के लिए।

+0

डाउनवोट क्यों? ROW_NUMBER का समर्थन करने वाले डेटाबेस इंजनों के लिए यह सही और सहायक है (सामान्य रूप से यह बनाम विकल्प कितना तेज़ है, किसी दिए गए डीबी पर विशिष्ट माप की आवश्यकता है)। –

+0

यह SQL सर्वर के लिए एक पूरी तरह से वैध समाधान है। –

+1

मैंने डाउनवोट नहीं दिया, लेकिन ओपी ने कहा कि वह माइक्रोसॉफ्ट एसक्यूएल सर्वर का उपयोग नहीं कर रहा था। वह हो सकता है, लेकिन उसने ऐसा नहीं कहा या इसके लिए अपना प्रश्न टैग किया। –

0

कोई भी तरीका नहीं है कि आप रिकॉर्ड के पूरे सबसेट को चुने बिना बता सकें। यदि आपका पीके पूर्णांक प्रकार का है, तो आप

select count(*) from mytable 
    where id <= 10 -- Record with ID 10 
    order by mycolumn asc 
+1

आईडी द्वारा आदेशित होने पर स्थिति को वापस लौटाता है, 'ऑर्डर बाय' खंड का कोई प्रभाव नहीं पड़ता है। – Guffa

2

एसक्यूएल इस तरह से काम नहीं करता है। यह सेट-आधारित है, जिसका अर्थ है कि "उस परिणाम तालिका में स्थिति" डेटाबेस के लिए व्यर्थ है।

जब आप परिणामसेट को ऑब्जेक्ट्स के संग्रह में मानचित्र करते हैं या जब आप इसे फिर से चालू करते हैं तो आप स्थिति का ट्रैक रख सकते हैं।

+0

+1 उत्कृष्ट उत्तर। एसक्यूएल सर्वर अब * डीबीएस की तरह नहीं है - अब और "रिकॉर्ड + 1" या ऐसा नहीं है। –

+0

यदि स्थिति व्यर्थ है, तो क्या उपयोग किया जाता है? या LIMIT, TOP, और ROW_NUMBER? – Andomar

+0

LIMIT, TOP, और ROW_NUMBER() मानक SQL भाषा का हिस्सा नहीं हैं। –

15

आप अभिलेखों की संख्या जहां मूल्य है कि आप पर छँटाई कर रहे हैं रिकॉर्ड है कि आप की कुंजी मान पता की तुलना में कम महत्व है भरोसा कर सकते हैं:

select count(*) 
from mytable 
where mycolumn < (select mycolumn from mytable where key = 42) 
+2

+1 सरल और ROW_NUMBER() पर निर्भर नहीं है। हालांकि आपको परिणाम में 1 जोड़ने की संभावना है, या मौका Andomar

+1

हां, यदि आप शून्य आधारित के बजाय स्थिति को एक आधार पर रखना चाहते हैं। – Guffa

+0

एक प्रावधान: यह विधि केवल अनन्य कुंजी पर काम करती है (जो एक पीके होगा) –

0

दुर्भाग्य से आप एक की स्थिति को प्राप्त नहीं कर सकता " एक टेबल में पंक्ति "।

ORDER BY और ROW_NUMBER निर्माण (उपयोग में डेटाबेस इंजन पर निर्भर करता है) का एक प्रकार का उपयोग करके आप सबसे अच्छा प्राप्त कर सकते हैं, निष्पादित क्वेरी के परिणामस्वरूप एक पंक्ति की स्थिति है।

यह स्थिति तालिका में किसी भी स्थिति पर वापस मैप नहीं करती है, हालांकि, जब तक ऑर्डर BY क्लस्टर इंडेक्स कॉलम के सेट पर न हो, तब भी उस स्थिति को अगले सेकेंड को अमान्य कर दिया जा सकता है।

मैं क्या जानना चाहता हूं कि आप इस "स्थिति" का उपयोग करने के लिए क्या चाहते हैं।

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