我有下表,其中列出了与相同关系相关的主题和对象。
|---------------------------------------| |Subject |Relationship |Object | |---------------------------------------| |A |x |B | |B |x |C | |B |x |D | |C |x |E | |D |x |F | |P |x |G | |---------------------------------------|
我需要编写一个SQL来获取所有相关的主题和对象给定一个初始主题。
例如:
答案 0 :(得分:1)
使用递归查询
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
答案 1 :(得分:1)
您需要使用递归:
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
答案 2 :(得分:1)
SAP HANA不支持常规递归公用表表达式(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会根据您的输入数据创建层次结构数据结构。我在这个例子中命名了你的表rels
。
SOURCE
部分声明如何解释源表/视图以构成层次结构。 ORPHAN ROOT
声明未连接到另一个节点的节点成为“根”节点。也就是说,层次结构不必是适当的循环自由树,但可以有孤立节点以及多个根和循环。
此层次结构构造在公用表表达式h
中捕获,但也可以放入视图或实现为(临时)表。
下一步是使用HIERARCHY_DESCENDANTS
函数让HANA从“A”节点开始“向下”层次结构分支。
这导致
NODE_ID
B
C
E
D
F
如有必要,可以将起始节点“联合”到结果集。
有关层次结构功能的更多详细信息,请参阅HANA文档here