ওরাকল: আমি কীভাবে একটি শ্রেণিবিন্যাসের টেবিলটি জিজ্ঞাসা করব?


10

পটভূমি

এটি আমরা দেখার জন্য ব্যবহার করব এমন কিছু দর্শন তৈরির জন্য।

আমার কাছে অবস্থানের একটি টেবিল রয়েছে, মূল ক্ষেত্রগুলি "অবস্থান" এবং "পিতামাতার"

স্তরভিত্তিক, এই দুটি ক্ষেত্রটি যে কাঠামোটি তৈরি করে, তা কোম্পানির নাম -> ক্যাম্পাসের নাম -> বিল্ডিংয়ের নাম -> মেঝের নাম -> ঘরের নামের লাইনের সাথে রয়েছে। এই ক্ষেত্রে কোম্পানির নাম একই থাকে এবং ক্যাম্পাসের নাম একই থাকে same

অবস্থানগুলির কাঠামোটি সাধারণত এটির মতো দেখায়:

                                 +-----------+
                                 | 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 যৌক্তিকভাবে, আমি মনে করি "বিল্ডিং" স্তরটি কোনও অভিভাবকের কাছে ক্যাম্পাসের নাম, যেমন "মাইনক্যাম্পাস" এর পিতামাতার সাথে কিছু হবে। সমস্ত নোডের মূল হ'ল "COMPANYNAME", যা "MAINCAMPUS" এর পিতামাতা এবং সমস্ত বিল্ডিংয়ের (প্লাস "ভিত্তি") পিতামাতা হিসাবে মাইনক্যাম্পাস থাকে।
শানকিলেন

কি দারুন! আপনি কিভাবে এটি তৈরি করলেন !! গুগল "এসকিউএল এডজেসেন্সি মডেল" এর জন্য আপনি সর্বদা প্রস্তুত
থাকবেন

পিএস, যারা আমি চিত্রটি কীভাবে তৈরি করেছি তাতে আগ্রহী তাদের জন্য, আমি asifif.com ডটকম নামে একটি নিফটি ছোট্ট ওয়েবসাইট ব্যবহার করেছি - আমি এরকম পরিস্থিতিতে খুব বড় ভক্ত।
শানকিলেন

উত্তর:


4

ফ্রাস্ট্রেটেড উইথফোর্ডস ডিজাইনারের সঠিক দিক (+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');

আপনি যদি নিজের বিল্ডিংটিকে উপ-স্থানগুলির মধ্যে একটি হিসাবে গণনা করতে না চান তবে আপনি বিদ্যমান ক্যোয়ারিকে মুছে ফেলতে পারেন একটি মুছে ফেলা এন্ট্রিতে যেখানে বিল্ডিং এবং sublocation একই।


লে, এটি ঠিক ছিল। সাহায্যের জন্য আপনাকে ধন্যবাদ!
শানকিলেন

9

CONNECT BY প্রাকৃতিক পুনরাবৃত্তি যে ডেটা হ্যান্ডেল করার সঠিক উপায় is

আপনার টেবিলটি দেখতে কেমন তা আমি জানি না তবে সম্ভবত এর মতো কিছু:

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

এটি "বিএলডিজি -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


উত্তরের জন্য ধন্যবাদ! আমি এটি উপলব্ধি করার জন্য যথেষ্ট পরিমাণে পাচ্ছি যে আমি আমার প্রশ্নের উত্তরটি ভালভাবে বলে মনে করি না। আমার সারণী কাঠামোর দুটি কলাম রয়েছে - "অবস্থান" এবং "পিতামাতার"। এই ক্রমবিন্যাসটি আমার এসকিআই চার্ট দ্বারা সংজ্ঞায়িত করা হয়েছে। আমি একটি ভিউ নির্মাণ করতে চাই যা "বিল্ডিং" স্তরের প্রতিটি অবস্থানের জন্য, তার শাখার নীচে সমস্ত অবস্থান দেখায়। আমার লক্ষ্য হ'ল কোনও বিল্ডিংয়ের অনুসন্ধান করতে এবং তার সমস্ত উপ-অবস্থানগুলি পেতে, বা একটি উপবৃত্তান্ত অনুসন্ধান করে এবং কোন বিল্ডিংয়ের সাথে সম্পর্কিত তা দেখার জন্য (সুতরাং কোয়েরিতে কোনও হার্ড-সংজ্ঞায়িত "বিল্ডিং-এক্স" নয়) to কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে!
শানকিলেন

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;

এটি আপনাকে প্রতিটি অবস্থানের শ্রেণিবিন্যাস প্রদর্শন করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.