Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एक पेड़ को पार करने के लिए किसी अन्य क्वेरी में तालिका उपनाम का प्रयोग करें

प्रश्न पूछा गया

आप नहीं एक तालिका उपनाम . का संदर्भ लें एक ही स्तर पर दूसरी क्वेरी में एक सबक्वेरी से (या 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 दोनों का प्रदर्शन।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ओरेकल डीबी तालिका से सी #/wpf . में सूची बॉक्स में मूल्य प्राप्त करना

  2. Oracle समूह पंक्ति का हिस्सा है और नवीनतम टाइमस्टैम्प के साथ पंक्ति प्राप्त करें

  3. Oracle डेटा एक्सेस FileNotFound:Oracle.DataAccess.Common.Configuration.Section.xsd

  4. एपेक्स इंटरएक्टिव रिपोर्ट एसक्यूएल में जहां क्लॉज में एक स्ट्रिंग कैसे संलग्न करें?

  5. पैकेज बॉडी से निजी प्रक्रियाओं/कार्यों की सूची प्राप्त करें