ओरेकल: मैं एक पदानुक्रमित तालिका को कैसे क्वेरी कर सकता हूं?


10

पृष्ठभूमि

यह उन कुछ दृश्यों के निर्माण के लिए है जिनका उपयोग हम रिपोर्टिंग के लिए करेंगे।

मेरे पास स्थानों की एक तालिका है, प्रमुख क्षेत्र "स्थान" और "माता-पिता" हैं

ये दो फ़ील्ड जो संरचना बनाते हैं, स्तर-वार, कंपनी के नाम की रेखाओं के साथ होते हैं -> कैम्पस नाम -> भवन का नाम -> मंजिल का नाम -> कक्ष का नाम। कंपनी का नाम एक ही रहता है और इस मामले में कैंपस का नाम एक ही रहता है।

स्थानों की संरचना आम तौर पर इस तरह दिखती है:

                                 +-----------+
                                 | Org. Name |
                                 +-----+-----+
                                       |
                                 +-----v-----+
           +--------------------+|Campus Name|+---+--+-------------+
           |                     +--+--------+    |                |
           |                        |             |                |
           |                        |             |                |
        +--+-----+           +------+-+        +--+----+       +---+---+
    +--+| BLDG-01|+--+       | BLDG-02|        |BLDG-03|       |Grounds|
    |   +--------+   |       +--------+        +-------+       +-------+
  +-+------+   +-----+--+
  |Floor-01|   |Basement+-------+
  +-+------+   +--------+       |
    |                           |
    |                           |
    | +----------+      +-------+--+
    +-+Room 1-001|      |Room B-002|
      +----------+      +----------+

प्रत्येक स्थान अपने मूल स्थान से जोड़ता है, जो अंततः संगठन का नाम है। वर्तमान में, केवल एक संगठन और एक परिसर है।

लक्ष्य

  • मैं "बिल्डिंग" स्तर पर किसी भी स्थान के नीचे सभी स्थानों को क्वेरी करने में सक्षम होना चाहूंगा। ऐसा इसलिए है कि मैं चीजों को वापस कर सकता हूं जैसे कि किसी दिए गए भवन के भीतर किसी भी स्थान के लिए कितने कार्यक्षेत्र किए गए हैं।
  • मैं यह निर्धारित करने में सक्षम होना चाहता हूं कि कौन सा उप-स्थान किस भवन का है । अनिवार्य रूप से रिवर्स; मैं भवन स्तर के नीचे किसी भी स्तर से जाना चाहूंगा और यह पता लगा सकता हूं कि भवन क्या है।
  • मैं चाहूंगा कि यह एक दृश्य में हो । इसका मतलब है, मैं एक तालिका रखना चाहूंगा कि "बिल्डिंग" स्तर पर प्रत्येक आइटम के लिए, बाएं हाथ के स्तंभ में इमारत और सभी संभावित स्थानों को सूचीबद्ध करता है जो कि दाएं हाथ के कॉलम में निर्माण करता है। इस तरह मेरे पास एक सूची होगी जिसे मैं किसी भी समय यह पता लगाने के लिए क्वेरी कर सकता हूं कि कौन से स्थान किस इमारत का हिस्सा हैं।

प्रयास और यह सही है

मैंने इसे बुरी तरह से निर्मित विचारों, यूनिअन प्रश्नों, आदि के माध्यम से करने का प्रयास किया है - जो सभी को एक बुरे विचार की तरह लग रहे हैं। मुझे पता है कि ओरेकल इसके लिए "कनेक्ट बाय" के माध्यम से एक तंत्र रखता है; मुझे यकीन नहीं है कि इसका उपयोग कैसे किया जाए।


"रूट" नोड्स की पहचान कैसे की जाती है? क्या माता-पिता NULLउनके लिए हैं? आप "भवन स्तर" की पहचान कैसे करते हैं?
a_horse_with_no_name

@a_horse_with_no_name तार्किक रूप से, मुझे लगता है कि "बिल्डिंग" का स्तर माता-पिता के साथ कुछ भी होगा जो कि परिसर का नाम है, अर्थात "MAINCAMPUS" के माता-पिता के साथ कुछ भी। सभी नोड्स की जड़ "कंपनीनाम" है, जो "MAINCAMPUS" के माता-पिता हैं, और सभी इमारतों (प्लस "आधार") में माता-पिता के रूप में MAINCAMPUS है।
सीनकेलेन 15

वाह! आपने कैसे बनाया !! Google के लिए "आसन्न मॉडल इन एसक्यूएल" आप सभी सेट होंगे
srini.venigalla

पुनश्च, उन लोगों के लिए जो मुझे कैसे आरेख बनाते हैं, में रुचि थी, मैंने asciiflow.com नामक एक छोटी सी वेब साइट का उपयोग किया - मैं उस तरह की स्थितियों के लिए एक बड़ा प्रशंसक हूं।
सीनकेलेन

जवाबों:


4

FrusteratedWithFormsDesigner की सही दिशा (+1) है। यहाँ मुझे लगता है कि आप विशेष रूप से देख रहे हैं।

CREATE OR REPLACE VIEW BuildingSubs AS
   SELECT connect_by_root location "Building", location "SubLocation"
   FROM some_table l
   START WITH l.Location IN 
      (
         SELECT location FROM
         (
         SELECT level MyLevel, location FROM some_table 
         START WITH parent IS NULL 
         CONNECT BY PRIOR location=parent
         )
         WHERE MyLevel=3   
      )
   CONNECT BY PRIOR l.location = l.parent;

select * from BuildingSubs; 

Building             SubLocation        
-------------------- --------------------
BLDG-01              BLDG-01              
BLDG-01              Basement             
BLDG-01              Room B-002           
BLDG-01              Floor-01             
BLDG-01              Room 1-001           
BLDG-02              BLDG-02              
BLDG-03              BLDG-03              
Grounds              Grounds              

दृश्य तीनों लक्ष्यों को पूरा करता है। आप किसी भवन के लिए इसे शामिल कर सकते हैं और इसमें जो कुछ भी है उसे खोजने के लिए इसे उप-स्थान के लिए क्वेरी कर सकते हैं।

drop table some_table;
create table some_table (Location Varchar2(20), Parent Varchar2(20));

insert into some_table values ('Org. Name',NULL);
insert into some_table values ('MAINCAMPUS','Org. Name');
insert into some_table values ('BLDG-01','MAINCAMPUS');
insert into some_table values ('BLDG-02','MAINCAMPUS');
insert into some_table values ('BLDG-03','MAINCAMPUS');
insert into some_table values ('Grounds','MAINCAMPUS');
insert into some_table values ('Floor-01','BLDG-01');
insert into some_table values ('Basement','BLDG-01');
insert into some_table values ('Room B-002','Basement');
insert into some_table values ('Room 1-001','Floor-01');

यदि आप भवन को स्वयं को उप-स्थानों में से एक के रूप में गिनना नहीं चाहते हैं, तो आप मौजूदा प्रविष्टियों में से किसी एक को समाप्त कर सकते हैं, जिसमें इमारतें और सबलेक्शंस समान हैं।


लेह, यह बिल्कुल यही था। सहायता के लिए धनयवाद!
सीनिलेन

9

CONNECT BY डेटा को संभालने का सही तरीका है जो स्वाभाविक रूप से पुनरावर्ती है।

मुझे नहीं पता कि आपकी तालिका कैसी दिखती है, लेकिन शायद कुछ ऐसा है:

SELECT *
FROM some_table st
START WITH st.location = 'BLDG-01'
CONNECT BY PRIOR st.location = st.parent;

इसे "BLDG-01" के तहत नोड्स मिलना चाहिए।

START WITHखंड अपने आधार मामला है।

एक और स्पष्टीकरण (ओरेकल से एक तरफ जो मुझे लगता है कि आप पहले से पढ़ चुके हैं और इससे परेशान थे, यह शायद बहुत ही कठिन है):

http://www.adp-gmbh.ch/ora/sql/connect_by.html

इसके अलावा:

http://psoug.org/reference/connectby.html

तथा:

http://www.oradev.com/connect_by.jsp


जवाब देने के लिए धन्यवाद! मुझे यह महसूस करने के लिए पर्याप्त हो रहा है कि मुझे नहीं लगता कि मैंने अपने प्रश्न को अच्छी तरह से समझा। मेरी तालिका संरचना में दो कॉलम हैं - "स्थान" और "माता-पिता"। इन पदानुक्रमों को मेरे एससीआई चार्ट द्वारा परिभाषित किया गया है। मैं "बिल्डिंग" स्तर पर प्रत्येक स्थान के लिए, उसकी शाखा के नीचे स्थित सभी स्थानों के लिए एक दृश्य बनाना चाहता हूं। मेरा लक्ष्य एक इमारत को क्वेरी करना और उसके सभी उप-स्थानों को प्राप्त करने में सक्षम होना है, या एक सब्लोकेशन को क्वेरी करना और देखना कि यह किस इमारत का है, एक दृश्य के माध्यम से (इसलिए क्वेरी में कोई हार्ड-परिभाषित "बिल्डिंग-एक्स" नहीं है)। किसी भी तरह की सहायता का स्वागत किया जाएगा!
सीनकिलेन

2

मुझे यकीन नहीं है कि मैं आपके सवाल को पूरी तरह से समझ पाऊंगा, लेकिन शायद कुछ इस तरह:

select location, 
       parent,
       sys_connect_by_path(location, '/') as item_list,
       case level
         when 1 then 'building'
         when 2 then 'floor'
         when 3 then 'room'
       end as item_type
from some_table 
start with parent = 'MAINCAMPUS'
connect by prior location = parent;

यह आपको प्रत्येक स्थान के लिए पदानुक्रम दिखाएगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.