SQL同层查询数据table
SQL Query to query data hierarchically in the same table
我有以下 table,其中包含与相同关系相关的主题和对象列表。
|----------------------------------------|
|主题 |关系 |对象 |
|----------------------------------------|
|A |x |B |
|B |x |C |
|B |x |D |
|C |x |E |
|D |x |F |
|P |x |G |
|----------------------------------------|
我需要写一个 SQL 以获得所有相关的 Subjects 和 Objects 给定初始主题。
例如:
- 如果 "C" 作为初始主题,输出应该是 "C" 和 "E"(因为 "C" 与 "E" 和 "x")
- 如果"A"作为初始主题,输出应该是"A"、"B"、"C"、"D"、"E"和 "F"。解释,
- "A" 与 "B"
有关
- "B" 与 "C" 和 "D"
有关
- "C" 与 "E"
有关
- "D" 与 "F"
有关
使用递归查询
with rcte as
(
select *
from data
where subject = 'a'
union all
select d.*
from data d
join rcte r on r.object = d.subject
)
select r.subject from rcte r
union
select r.object from rcte r
您需要使用递归:
DECLARE @Subject char(1) = 'A'
;WITH cte AS ( -- Your table sample
SELECT [Subject],
[Relationship],
[Object]
FROM (VALUES
('A' ,'x' ,'B'),
('B' ,'x' ,'C'),
('B' ,'x' ,'D'),
('C' ,'x' ,'E'),
('D' ,'x' ,'F'),
('P' ,'x' ,'G')
) as t([Subject],[Relationship],[Object])
), rec AS ( -- Recursive CTE
SELECT [Object]
FROM cte
WHERE [Subject] = @Subject
UNION ALL
SELECT c.[Object]
FROM cte c
INNER JOIN rec r
ON r.[Object] = c.[Subject]
)
SELECT @Subject
UNION ALL
SELECT *
FROM rec
输出:
A
B
C
D
F
E
SAP HANA 不支持通用递归通用 table 表达式 (CTE)。
相反,对于像这样的一个非常常见的用例(层次结构处理),可以使用一组特定的函数(使用 HANA 2 SP2):
with h as (SELECT * FROM HIERARCHY (
SOURCE (select "Subject" as parent_id,
"Object" as node_id
from rels
order by "Subject" asc)
ORPHAN ROOT ))
SELECT
node_id
FROM
HIERARCHY_DESCENDANTS (
SOURCE h
START WHERE parent_id ='A');
使用 HIERARCHY
函数,HANA 从您的输入数据创建层次结构数据结构。我在这个例子中命名了你的 table rels
。
SOURCE
部分声明源 table/view 应如何解释以构成层次结构。 ORPHAN ROOT
声明未连接到另一个节点的节点成为 "root" 个节点。也就是说,层次结构不必是适当的无循环树,但可以有孤立节点以及多个根和循环。
此层次结构在通用 table 表达式 h
中捕获,但也可以放入视图或具体化为(临时)table.
下一步是使用 HIERARCHY_DESCENDANTS
函数使 HANA "walk down" 层次结构分支从 'A' 节点开始。
这导致
NODE_ID
B
C
E
D
F
如果需要,起始节点可以"unioned"到结果集。
有关层次结构功能的更多详细信息,请参阅 HANA 文档 here
我有以下 table,其中包含与相同关系相关的主题和对象列表。
|----------------------------------------| |主题 |关系 |对象 | |----------------------------------------| |A |x |B | |B |x |C | |B |x |D | |C |x |E | |D |x |F | |P |x |G | |----------------------------------------|
我需要写一个 SQL 以获得所有相关的 Subjects 和 Objects 给定初始主题。
例如:
- 如果 "C" 作为初始主题,输出应该是 "C" 和 "E"(因为 "C" 与 "E" 和 "x")
- 如果"A"作为初始主题,输出应该是"A"、"B"、"C"、"D"、"E"和 "F"。解释,
- "A" 与 "B" 有关
- "B" 与 "C" 和 "D" 有关
- "C" 与 "E" 有关
- "D" 与 "F" 有关
使用递归查询
with rcte as
(
select *
from data
where subject = 'a'
union all
select d.*
from data d
join rcte r on r.object = d.subject
)
select r.subject from rcte r
union
select r.object from rcte r
您需要使用递归:
DECLARE @Subject char(1) = 'A'
;WITH cte AS ( -- Your table sample
SELECT [Subject],
[Relationship],
[Object]
FROM (VALUES
('A' ,'x' ,'B'),
('B' ,'x' ,'C'),
('B' ,'x' ,'D'),
('C' ,'x' ,'E'),
('D' ,'x' ,'F'),
('P' ,'x' ,'G')
) as t([Subject],[Relationship],[Object])
), rec AS ( -- Recursive CTE
SELECT [Object]
FROM cte
WHERE [Subject] = @Subject
UNION ALL
SELECT c.[Object]
FROM cte c
INNER JOIN rec r
ON r.[Object] = c.[Subject]
)
SELECT @Subject
UNION ALL
SELECT *
FROM rec
输出:
A
B
C
D
F
E
SAP HANA 不支持通用递归通用 table 表达式 (CTE)。 相反,对于像这样的一个非常常见的用例(层次结构处理),可以使用一组特定的函数(使用 HANA 2 SP2):
with h as (SELECT * FROM HIERARCHY (
SOURCE (select "Subject" as parent_id,
"Object" as node_id
from rels
order by "Subject" asc)
ORPHAN ROOT ))
SELECT
node_id
FROM
HIERARCHY_DESCENDANTS (
SOURCE h
START WHERE parent_id ='A');
使用 HIERARCHY
函数,HANA 从您的输入数据创建层次结构数据结构。我在这个例子中命名了你的 table rels
。
SOURCE
部分声明源 table/view 应如何解释以构成层次结构。 ORPHAN ROOT
声明未连接到另一个节点的节点成为 "root" 个节点。也就是说,层次结构不必是适当的无循环树,但可以有孤立节点以及多个根和循环。
此层次结构在通用 table 表达式 h
中捕获,但也可以放入视图或具体化为(临时)table.
下一步是使用 HIERARCHY_DESCENDANTS
函数使 HANA "walk down" 层次结构分支从 'A' 节点开始。
这导致
NODE_ID
B
C
E
D
F
如果需要,起始节点可以"unioned"到结果集。
有关层次结构功能的更多详细信息,请参阅 HANA 文档 here