SQL Query在同一个表中分层查询数据

时间:2017-12-04 11:00:39

标签: sql sql-server hana

我有下表,其中列出了与相同关系相关的主题和对象。

    |---------------------------------------|
    |Subject    |Relationship    |Object    |
    |---------------------------------------|
    |A          |x               |B         |
    |B          |x               |C         |
    |B          |x               |D         |
    |C          |x               |E         |
    |D          |x               |F         |
    |P          |x               |G         |
    |---------------------------------------|

我需要编写一个SQL来获取所有相关的主题对象给定一个初始主题。

例如:

  1. 如果给出“C”作为初始主题,则输出应为“C”和“E”(因为“C”与“E”与“x”相关)
  2. 如果给出“A”作为初始主题,则输出应为“A”,“B”,“C”,“D”,“E”和“F”。说明,
    • “A”与“B”
    • 有关
    • “B”与“C”和“D”
    • 有关
    • “C”与“E”
    • 有关
    • “D”与“F”
    • 有关

3 个答案:

答案 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

demo

答案 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会根据您的输入数据创建层次结构数据结构。我在这个例子中命名了你的表relsSOURCE部分声明如何解释源表/视图以构成层次结构。 ORPHAN ROOT声明未连接到另一个节点的节点成为“根”节点。也就是说,层次结构不必是适当的循环自由树,但可以有孤立节点以及多个根和循环。

此层次结构构造在公用表表达式h中捕获,但也可以放入视图或实现为(临时)表。

下一步是使用HIERARCHY_DESCENDANTS函数让HANA从“A”节点开始“向下”层次结构分支。 这导致

NODE_ID
B      
C      
E      
D      
F      

如有必要,可以将起始节点“联合”到结果集。

有关层次结构功能的更多详细信息,请参阅HANA文档here