प्रश्न पूछा गया
आप नहीं एक तालिका उपनाम . का संदर्भ लें एक ही स्तर पर दूसरी क्वेरी में एक सबक्वेरी से (या UNION
. के दूसरे चरण में) सवाल)। तालिका उपनाम केवल क्वेरी और उसकी उप-प्रश्नों में ही दिखाई देता है।
आप कर सकते थे लेटरल जॉइन
. उदाहरण:
इस द्वारा समूह के साथ सरणी में सबसे आम तत्व खोजें
छोटे अधिकतम स्तरों के लिए समाधान
केवल कुछ ही स्तरों के लिए (यदि आप जानते हैं अधिकतम), आप एक साधारण क्वेरी का उपयोग कर सकते हैं:
बाएं शामिल हों
तालिका के n-1 उदाहरणों के लिए हीCOALESCE
का उपयोग करें और एककेस
जड़ और ऊंचाई को कम करने के लिए बयान,
SELECT p1.c AS child, COALESCE(p3.p, p2.p, p1.p) AS parent
,CASE
WHEN p3.p IS NOT NULL THEN 3
WHEN p2.p IS NOT NULL THEN 2
ELSE 1
END AS height
FROM parent p1
LEFT JOIN parent p2 ON p2.c = p1.p
LEFT JOIN parent p3 ON p3.c = p2.p
WHERE p1.c IN (3, 8)
ORDER BY p1.c;
यह मानक SQL है और सभी 4 RDBMS में काम करना चाहिए आपने टैग किया।
स्तरों की मनमानी संख्या के लिए सामान्य समाधान
पुनरावर्ती CTE का उपयोग करें जैसे @Ken पहले ही सलाह दे चुके हैं।
- पुनरावर्ती चरण में बच्चे को रखें प्रत्येक पंक्ति के लिए, केवल पैरेंट को आगे बढ़ाएं।
- बाहरी में
चुनें
, केवल सबसे बड़ीऊंचाई
वाली पंक्ति रखें प्रति बच्चा।
WITH RECURSIVE cte AS (
SELECT c AS child, p AS parent, 1 AS height
FROM parent
WHERE c IN (3, 8)
UNION ALL
SELECT c.child, p.p AS parent, c.height + 1
FROM cte c
JOIN parent p ON p.c = c.parent
-- WHERE c.height < 10 -- to safeguard against endless loops if necessary
)
SELECT DISTINCT ON (child) *
FROM cte
ORDER BY child, height DESC;
DISTINCT ON
पोस्टग्रेज . के लिए विशिष्ट है . व्याख्या:
समूह द्वारा प्रत्येक समूह में पहली पंक्ति का चयन करें?
बाकी Oracle . में इसी तरह से काम करेंगे और यहां तक कि SQLite , लेकिन MySQL में नहीं जो CTE का समर्थन नहीं करता है।
SQL Fiddle दोनों का प्रदर्शन।