簡體   English   中英

如何獲取子記錄的父母、祖父母等及其本身以及 SQL 中與根的距離

[英]How can i get a child record's parent, grandparent, and so on and itself along with the distance from root in SQL

我有一張如下所示的表格 -

    ID | NAME        | PARENT

     1 | Global      | null 
     2 | USA         | 1
     3 | Canada      | 1
     4 | USA-1       | 2
     5 | USA-11      | 4

父列是指列 id,即 Global 是根。 對於 USA-11,USA-1 是父母,USA 是祖父母,Global 是曾祖父母。 它是一個堅固的層次結構,可以 go 達到任何級別 我需要幫助編寫一個查詢,該查詢將以下列方式擴展此層次結構 -

    ID | NAME        | PARENT    | Distance_from_parent

     1 | Global      | Global    | 0
     2 | USA         | USA       | 0
     2 | USA         | Global    | 1
     3 | Canada      | Canada    | 0
     3 | Canada      | Global    | 1
     4 | USA-1       | USA-1     | 0
     4 | USA-1       | USA       | 1
     4 | USA-1       | Global    | 2
     5 | USA-11      | USA-11    | 0
     5 | USA-11      | USA-1     | 1
     5 | USA-11      | USA       | 2
     5 | USA-11      | Global    | 3

因此,如果您注意到,我將針對其自身及其層次結構重復每個位置名稱。 “distance_from_parent”列是與“Parent”列中提到的父級的距離。

我已經嘗試過使用 Connect By、Level 和之前的方法,但無法實現這種 output。

用於此的 DDL 是 -

create table subsidiary (id number, name varchar2(50), parent number); 

insert into subsidiary (id, name, parent) values (1, 'Parent', null);
insert into subsidiary (id, name, parent) values (2, 'USA', 1);
insert into subsidiary (id, name, parent) values (3, 'Canada', 1);
insert into subsidiary (id, name, parent) values (4, 'USA-1', 2);
insert into subsidiary (id, name, parent) values (5, 'USA-11', 4);

使用帶有CONNECT_BY_ROOT的分層查詢:

SELECT CONNECT_BY_ROOT( ID ) AS id,
       CONNECT_BY_ROOT( name ) AS name,
       name AS parent,
       LEVEL - 1 AS distance_from_parent
FROM   subsidiary
CONNECT BY PRIOR parent = id
ORDER BY id, distance_from_parent;

因此,對於您的測試數據:

CREATE TABLE subsidiary ( ID, NAME, PARENT ) AS
SELECT 1, 'Global', null FROM DUAL UNION ALL 
SELECT 2, 'USA',    1 FROM DUAL UNION ALL
SELECT 3, 'Canada', 1 FROM DUAL UNION ALL
SELECT 4, 'USA-1',  2 FROM DUAL UNION ALL
SELECT 5, 'USA-11', 4 FROM DUAL;

這輸出:

 身份證 | 姓名 | 家長 |  DISTANCE_FROM_PARENT -: |:----- |:----- |  -------------------: 1 | 全球 | 全球 |  0 2 | 美國 | 美國 |  0 2 | 美國 | 全球 |  1 3 | 加拿大 | 加拿大 |  0 3 | 加拿大 | 全球 |  1 4 | 美國-1 | 美國-1 |  0 4 | 美國-1 | 美國 |  1 4 | 美國-1 | 全球 |  2 5 | 美國-11 | 美國-11 |  0 5 | 美國-11 | 美國-1 |  1 5 | 美國-11 | 美國 |  2 5 | 美國-11 | 全球 |  3

db<> 在這里擺弄

您可以使用CONNECT BY來獲得您想要的結果:

SELECT s.id, s.name, CONNECT_BY_ROOT(s.name) AS ROOT_NAME, LEVEL-1 AS ROOT_DISTANCE
FROM subsidiary s
CONNECT BY s.parent = PRIOR(s.id)
ORDER BY s.id, LEVEL;

這是此解決方案的 SQLFiddle。 鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM