2010-10-13 10 views
6

मैंने नीचे अपनी SQL क्वेरी का एक बहुत ही सरल संस्करण चिपकाया है। जिस समस्या में मैं चल रहा हूं वह यह है कि ORDER BY कथन मेरे सीटीई के चयन परिणामों को प्रभावित कर रहा है। मैं यह समझने में सक्षम नहीं हूं कि यह क्यों है, मेरी मूल सोच यह थी कि सीटीई के भीतर, मैं कुछ SELECT कथन निष्पादित करता हूं, फिर ORDER BY को उन परिणामों पर काम करना चाहिए।परिणाम सेट को प्रभावित करके एसक्यूएल सीटीई और ऑर्डर

दुर्भाग्य से मैं जो व्यवहार देख रहा हूं वह यह है कि मेरे आंतरिक SELECT कथन को 'आइटम' देकर, TOP 10 में नहीं है, द्वारा आदेश से प्रभावित किया जा रहा है।

यहाँ डेटा का एक उदाहरण है: (आईडी के आधार पर उलटे क्रम में इंडेक्स)

ID, Date 
9600 2010-10-12 
9599 2010-09-08 
9598 2010-08-31 
9597 2010-08-31 
9596 2010-08-30 
9595 2010-08-11 
9594 2010-08-06 
9593 2010-08-05 
9592 2010-08-02 
.... 
9573 2010-08-10 
.... 
8174 2010-08-05 
.... 
38 2029-12-20 

मेरे मूल क्वेरी:

;with results as(
select TOP 10 ID, Date 
from dbo.items 
) 
SELECT ID 
FROM results 

क्वेरी:

ID, Date 
9600 2010-10-12 
9599 2010-09-08 
9598 2010-08-31 
9597 2010-08-31 
9596 2010-08-30 
9595 2010-08-11 
9594 2010-08-06 
9593 2010-08-05 
9592 2010-08-02 

ORDER BY

;with results as(
select TOP 10 ID, Date 
from dbo.items 
) 
SELECT ID 
FROM results 
ORDER BY Date DESC 

क्वेरी के साथ मेरा क्वेरी रिटर्न:

ID, Date 
38 2029-12-20 
9600 2010-10-12 
9599 2010-09-08 
9598 2010-08-31 
9597 2010-08-31 
9596 2010-08-30 
9595 2010-08-11 
9573 2010-08-10 
9594 2010-08-06 
8174 2010-08-05 

किसी को भी व्याख्या कर सकते हैं क्यों पहली क्वेरी केवल आईडी तालिका के शीर्ष 10 में हैं वापस आ जाएगी, और दूसरी क्वेरी पूरी तालिका के शीर्ष 10 लौटाता है (सॉर्टिंग लागू होने के बाद)।

उत्तर

10

जब आप का उपयोग SELECT TOP n आप चाहिए एक ORDER BY की आपूर्ति करता है, तो आप नियतात्मक व्यवहार अन्यथा चाहते सर्वर किसी भी 10 पंक्तियों यह की तरह लगता है वापस जाने के लिए स्वतंत्र है। जो व्यवहार आप देख रहे हैं वह पूरी तरह मान्य है।

समस्या को हल करने के लिए, CTE के अंदर एक ORDER BY निर्दिष्ट करें:

WITH results AS 
(
    SELECT TOP 10 ID, Date 
    FROM dbo.items 
    ORDER BY ID DESC 
) 
SELECT ID 
FROM results 
ORDER BY Date 
+0

मुझे लगता है कि मैं इसे तालिका से शीर्ष 10 पंक्तियों को वापस करने के लिए चाहता था, और फिर उन शीर्ष 10 पंक्तियों द्वारा क्रमबद्ध करने के लिए, पूरी तालिका का ऑर्डर नहीं , और choo उस सेट से शीर्ष 10 तक ... मेरी गलत समझ कहां है? – Brett

+2

@ ब्रेट - आपको डेटाबेस से "टेबल से शीर्ष 10 पंक्तियों" का अर्थ बताएं। मेट्रिक के अनुसार शीर्ष 10? शायद तिथि से क्रमबद्ध? –

+0

तो क्या आप कह रहे हैं कि मुझे सीटीई के भीतर एक आदेश प्राप्त करने की आवश्यकता है? तो: '; परिणाम के साथ (चयन शीर्ष 10 आईडी, आईडी desc द्वारा आदेश आइटम से पोस्ट किया गया)'? .... मेरा भ्रम सीटीई परिणामों के बाहर एक 'ऑर्डर बी' क्यों सीटीई परिणामों को प्रभावित कर रहा है? – Brett

1

मैं आप की तरह

SELECT ROW_NUMBER() OVER(ORDER BY <ColumnName>;) AS RowNo 

और फिर अपने सभी स्तंभों .. यह आप में मदद मिलेगी नया स्तंभ जोड़ सकते हैं लगता है सीटीई एंकर का उपयोग करके पूछताछ करने के लिए ... कहां, जहां आदि खंड ..

+0

जो सही उत्तर है। – hoanvd1210

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