संभावित स्पष्टीकरण का प्रदर्शन।
टेबल स्क्रिप्ट बनाएं
SELECT *
INTO #T
FROM master.dbo.spt_values
CREATE NONCLUSTERED INDEX [IX_T] ON #T ([name] DESC,[number] DESC);
प्रश्न एक (35 परिणाम देता है)
WITH cte AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY NAME) AS rn
FROM #T
)
SELECT c1.number,c1.[type]
FROM cte c1
JOIN cte c2 ON c1.rn=c2.rn AND c1.number <> c2.number
प्रश्न दो (पहले की तरह ही लेकिन c2 को जोड़ने पर। [प्रकार] चयन सूची में यह 0 परिणाम देता है);
WITH cte AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY NAME) AS rn
FROM #T
)
SELECT c1.number,c1.[type] ,c2.[type]
FROM cte c1
JOIN cte c2 ON c1.rn=c2.rn AND c1.number <> c2.number
क्यों?
Row_number() डुप्लिकेट NAMEs के लिए निर्दिष्ट नहीं है, इसलिए यह आवश्यक आउटपुट कॉलम के लिए सर्वोत्तम निष्पादन योजना के साथ जो भी फिट बैठता है उसे चुनता है। दूसरी क्वेरी में यह दोनों सीटीई आमंत्रणों के लिए समान है, पहले में यह परिणामी विभिन्न पंक्ति_नंबरिंग के साथ एक अलग पहुंच पथ चुनता है।
सुझाए गए समाधान
आप स्वयं सीटीई में ROW_NUMBER() over (order by t.[Date])
में शामिल हो रहे हैं
उम्मीद की जा सकती है कि सीटीई के विपरीत भौतिक नहीं होना
जो स्वयं में शामिल होने के लिए एकरूपता सुनिश्चित करता और इस प्रकार आप ROW_NUMBER()
के बीच एक सहसंबंध मान लेते हैं दोनों पक्षों पर जो रिकॉर्ड के लिए मौजूद नहीं हो सकते हैं जहां एक डुप्लिकेट [Date]
डेटा में मौजूद है।
क्या होगा यदि आप ROW_NUMBER() over (order by t.[Date], t.[id])
के अनुसार ऑर्डर करें। यह सुनिश्चित करने के लिए कि बंधी हुई तिथियों की स्थिति में row_numbering एक गारंटीकृत सुसंगत क्रम में है। (या कुछ अन्य कॉलम/स्तंभों का संयोजन जो रिकॉर्ड में अंतर कर सकते हैं यदि आईडी ऐसा नहीं करेगी)