Найти все возможные отношения между двумя узлами в модели данных с множественной родительской иерархией [SQL Server] - PullRequest
1 голос
/ 28 марта 2019

У меня есть модель данных для определения многопользовательских иерархических данных. Каждая запись будет представлять отношения двух узлов, в которых один будет родительским, а другой - дочерним. В моем случае узел может иметь несколько родителей. Мне нужно найти все возможные отношения между двумя узлами.

Например, возьмите приведенную ниже таблицу.

---------------------------------
| id | parent_node | child_node |
---------------------------------
| 1  | NULL        | A          |
| 2  | NULL        | B          |
| 3  | A           | C          |
| 4  | A           | D          |
| 5  | B           | D          |
| 6  | B           | E          |
| 7  | C           | G          |
| 8  | C           | H          |
| 10 | D           | I          |
| 11 | E           | I          |
| 12 | E           | J          |
---------------------------------

Это сформирует график как показано ниже

        A   B
       / \ / \    
      C   D   E
    /  \   \ / \
   G    H   I   J

В приведенной выше модели A и B будут узлами верхнего уровня, и у каждого есть два дочерних элемента. Узел D назначен дочерним узлом узлов A и B. А также узел I назначен дочерним узлом узла D и узла E. Все остальные узлы имеют ровно одного родителя.

Мне нужно написать запрос, чтобы показать все возможные отношения узла с другим узлом . Например,

  1. A и C имеют отношения, потому что C является потомком Узла A.
  2. A и D имеют отношения, потому что D является дочерним по отношению к Узлу A.
  3. A и G имеют отношение, потому что G является внуком Узла A.
  4. Это пойдет на любое количество уровней.
  5. Два узла не имеют никакой связи, если какой-либо один узел не является дочерним или внуком n-го уровня другого.

Если два узла не имеют каких-либо отношений, они не будут отображаться.

Окончательный результат для приведенного выше графика будет таким, как показано ниже,

----------------------------
| parent_node | child_node |
----------------------------
| A           | C          |
| A           | D          |
| C           | G          |
| C           | H          |
| D           | I          |
| A           | G          |
| A           | H          |
| A           | I          |
| B           | D          |
| B           | E          |
| B           | I          |
| E           | I          |
| E           | J          |
| B           | J          |
----------------------------

Я новичок в SQL Server. Пожалуйста, помогите мне решить этот вопрос.

1 Ответ

1 голос
/ 28 марта 2019

Проведя некоторые исследования, я смог написать запрос сам. Как отметил @SeanLange в комментариях, этот тип запроса называется рекурсивным CTE.

Если имя таблицы nodes, следующий запрос создаст новую таблицу relationship и сохранит в ней все возможные связи, как указано в моем вопросе.

;with cte as (
    select  child_node
    ,       parent_node
    ,       child_node as root
    from    nodes
    union all
    select  child.child_node
    ,       child.parent_node
    ,       parent.root
    from    cte parent
    join    nodes child
    on      parent.parent_node = child.child_node
)
select parent_node,
       root as child_node
into   relationship
from   cte
where  parent_node is not null;

select * from relationship;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...