Oracle sql - 从 link table 生成完整的层次链
Oracle sql - Generate full hierarchical chain from link table
假设您有以下 table 和数据
create table articles (article_id number, name varchar2(30));
create table tags (tag_id number, parent_tag_id number, name varchar2(30));
create table associations (article_id number, tag_id number);
insert into articles values (1, 'item 1');
insert into articles values (2, 'item 2');
insert into articles values (3, 'item 3');
insert into tags values (100, null, 'parent');
insert into tags values (101, 100, 'child');
insert into tags values (102, 101, 'grandchild');
insert into tags values (103, null, 'another parent');
insert into associations values (1, 102);
insert into associations values (2, 101);
insert into associations values (3, 103);
关联 table link 是一篇具有最高级别标签的文章。遍历标签并生成完整链的最高效方法是什么?
例如对于以上数据我们应该看到
Article Name
Tag Name
item 1
parent
item 1
child
item 1
grandchild
item 2
parent
item 2
child
item 3
another parent
我试过使用 connect by prior
来生成标签和父标签之间的关系,但我正在努力 link 三个 table 在一起并保留文章名称(我想知道如何使用 connect_by_root
来保留名称)
您可以CROSS APPLY
一个相关的分层查询:
SELECT r.name AS article_name,
t.name AS tag_name
FROM articles r
INNER JOIN associations a
ON ( r.article_id = a.article_id )
CROSS APPLY(
SELECT name
FROM tags t
START WITH t.tag_id = a.tag_id
CONNECT BY PRIOR parent_tag_id = tag_id
) t
对于您的示例数据,输出:
ARTICLE_NAME | TAG_NAME
:----------- | :-------------
item 1 | grandchild
item 1 | child
item 1 | parent
item 2 | child
item 2 | parent
item 3 | another parent
db<>fiddle here
假设您有以下 table 和数据
create table articles (article_id number, name varchar2(30));
create table tags (tag_id number, parent_tag_id number, name varchar2(30));
create table associations (article_id number, tag_id number);
insert into articles values (1, 'item 1');
insert into articles values (2, 'item 2');
insert into articles values (3, 'item 3');
insert into tags values (100, null, 'parent');
insert into tags values (101, 100, 'child');
insert into tags values (102, 101, 'grandchild');
insert into tags values (103, null, 'another parent');
insert into associations values (1, 102);
insert into associations values (2, 101);
insert into associations values (3, 103);
关联 table link 是一篇具有最高级别标签的文章。遍历标签并生成完整链的最高效方法是什么?
例如对于以上数据我们应该看到
Article Name | Tag Name |
---|---|
item 1 | parent |
item 1 | child |
item 1 | grandchild |
item 2 | parent |
item 2 | child |
item 3 | another parent |
我试过使用 connect by prior
来生成标签和父标签之间的关系,但我正在努力 link 三个 table 在一起并保留文章名称(我想知道如何使用 connect_by_root
来保留名称)
您可以CROSS APPLY
一个相关的分层查询:
SELECT r.name AS article_name,
t.name AS tag_name
FROM articles r
INNER JOIN associations a
ON ( r.article_id = a.article_id )
CROSS APPLY(
SELECT name
FROM tags t
START WITH t.tag_id = a.tag_id
CONNECT BY PRIOR parent_tag_id = tag_id
) t
对于您的示例数据,输出:
ARTICLE_NAME | TAG_NAME :----------- | :------------- item 1 | grandchild item 1 | child item 1 | parent item 2 | child item 2 | parent item 3 | another parent
db<>fiddle here