Sql 连接两个分层查询以形成更大的层次结构

Sql 连接两个分层查询以形成更大的层次结构,sql,oracle,hierarchical-data,recursive-query,Sql,Oracle,Hierarchical Data,Recursive Query,我已经研究过这个问题,知道我不是第一个提出这个问题的人,但我似乎无法理解它。我已经创建了一个简单的例子,我认为如果有人能够提供缺少的链接,它将帮助我破解它 我有一个包含各大洲和国家等级的区域表 我还有一个包含城市和地标的位置表。此表包含要连接到area表的area id列 create table areas ( id NUMBER not null, name VARCHAR2(200) not null, parent_id

我已经研究过这个问题,知道我不是第一个提出这个问题的人,但我似乎无法理解它。我已经创建了一个简单的例子,我认为如果有人能够提供缺少的链接,它将帮助我破解它

我有一个包含各大洲和国家等级的区域表

我还有一个包含城市和地标的位置表。此表包含要连接到area表的area id列

    create table areas
(
  id            NUMBER not null,
  name          VARCHAR2(200) not null,
  parent_id     NUMBER
);

-- Top Level
Insert into areas (id, name)
 Values (1, 'Europe');
Insert into areas (id, name)
 Values (2, 'Americas');
Insert into areas (id, name)
 Values (3, 'Asia ex Japan');
Insert into areas (id, name)
 Values (4, 'Japan');

 -- Jurisdictions
Insert into areas (id, name, parent_id)
 Values (5, 'UK', 1);
Insert into areas (id, name, parent_id)
 Values (7, 'France', 1);
Insert into areas (id, name, parent_id)
 Values (6, 'Germany', 1);
Insert into areas (id, name, parent_id)
 Values (8, 'Italy', 1);
Insert into areas (id, name, parent_id)
 Values (9, 'US', 2);
Insert into areas (id, name, parent_id)
 Values (10, 'Australia', 3);
Insert into areas (id, name, parent_id)
 Values (11, 'New Zealand', 3);

create table places
(
  id            NUMBER not null,
  name          VARCHAR2(200) not null,
  area_id       NUMBER,
  parent_id     NUMBER
);

Insert into places (id, name, area_id, parent_id)
 Values (1, 'London', 5, NULL);
Insert into places (id, name, area_id, parent_id)
 Values (2, 'Bath', 5, NULL);
Insert into places (id, name, area_id, parent_id)
 Values (3, 'Liverpool', 5, NULL);
Insert into places (id, name, area_id, parent_id)
 Values (4, 'Paris', 7, NULL);
Insert into places (id, name, area_id, parent_id)
 Values (5, 'New York', 9, NULL);
Insert into places (id, name, area_id, parent_id)
 Values (6, 'Chicago', 9, NULL);
Insert into places (id, name, area_id, parent_id)
 Values (7, 'Kings Cross', 5, 1);
Insert into places (id, name, area_id, parent_id)
 Values (8, 'Tower of London', 5, 1);
我可以像这样独立地查询这些表:

 SELECT a.*, level FROM areas a
start with parent_id is null
connect by prior id = parent_id

SELECT p.*, level FROM places p
start with parent_id is null
connect by prior id = parent_id
有人能告诉我最后一步是如何将它们合并到一个具有四个级别的查询中吗?我在甲骨文公司工作多年,但不知怎么的,这件事从来没有发生过

如果places表中没有connect by Preor,只有一个带有区域id的城市列表,这会更容易吗

谢谢你这是你需要的吗

with src as (
  select 'A' type, a.id, a.name, a.parent_id, null area_id from areas a
  union all
  select 'P', -p.id id, p.name, -p.parent_id parent_id, area_id from places p)
select 
  src.*, level
from 
  src
start with 
  type = 'A' and parent_id is null
connect by 
  parent_id = prior id or 
  parent_id is null and area_id = prior id

这正好解决了我的问题,谢谢!我会尽快做正确的标记。我对places表中没有层次结构的情况进行了编辑-这会改变您处理此问题的方式吗?再次感谢。不,不会的。通常,如果希望使用
connectby
,应将所有行合并到一个记录集中。我使用了一个带有否定ID的技巧,但这不是必需的。您只需使联接更精确,如
type=previous type和parent\u id=previous id