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 以获得所有相关的 SubjectsObjects 给定初始主题。

例如:

  1. 如果 "C" 作为初始主题,输出应该是 "C" 和 "E"(因为 "C" 与 "E" 和 "x")
  2. 如果"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

demo

您需要使用递归:

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 relsSOURCE 部分声明源 table/view 应如何解释以构成层次结构。 ORPHAN ROOT 声明未连接到另一个节点的节点成为 "root" 个节点。也就是说,层次结构不必是适当的无循环树,但可以有孤立节点以及多个根和循环。

此层次结构在通用 table 表达式 h 中捕获,但也可以放入视图或具体化为(临时)table.

下一步是使用 HIERARCHY_DESCENDANTS 函数使 HANA "walk down" 层次结构分支从 'A' 节点开始。 这导致

NODE_ID
B      
C      
E      
D      
F      

如果需要,起始节点可以"unioned"到结果集。

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