Вопросы о самостоятельном присоединении

У меня есть вопрос относительно SQL-соединения для MySQL.

Предположим, у меня есть следующая таблица A и отношения родитель-потомок. Как я могу получить все дочерние элементы (включая дочерние дочерние элементы до конечного узла) с указанным родительским идентификатором?

Таблица А
дочерний идентификатор родительский идентификатор 
1            1
2            1
3            1
4            2
5            3
8            9

Из приведенной выше таблицы, если мы дали parent (1), я должен сделать запрос так, чтобы с учетом идентификатора parent (1) он дал пример всей иерархии:

дочерний идентификатор родительский идентификатор 
1 1
2 1
3 1
4 2
5 3

Одно из ограничений: я не могу изменить модель данных, потому что модель данных - это таблицы базы данных JBPM (с открытым исходным кодом). Я добавляю некоторые функции для таблицы ProcessInstancelog в граф JBPM для подпроцесса (для каждого процесса разветвления).

2 ответа

Похоже, вы хотите иметь возможность выбрать родителя, а затем получить все его дочерние элементы, независимо от того, где он находится в иерархии.

Наиболее эффективным способом является использование таблицы обратной связи. В котором каждый дочерний элемент будет связан со своим родителем, предоставит родителя и т. Д., Пока вы не достигнете корня дерева.

Это, очевидно, означает, что вам нужно больше работать над записью, чтобы поддерживать таблицу, но это избавит вас от сложности при запросе таблицы.

пример

id       parent
1        0
2        1
3        1
4        2

Обратный стол

child     parent    level
2         1         1
3         1         1
4         2         1
4         1         2

С этим вы можете сделать отбор в вашем запросе с помощью (выберите child, где parent = 1)

Вы можете сделать это в SQL, как это.

CREATE TABLE [dbo].[Employee](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nchar](10) NULL,
[managerId] [int] NULL,

)  

  WITH UserCTE AS (
    SELECT id, name, managerId,0 AS steps
     FROM dbo.[Employee]
     WHERE id = 1 

 UNION ALL

  SELECT mgr.id, mgr.name, mgr.managerId, usr.steps +1 AS steps
  FROM UserCTE AS usr
   INNER JOIN dbo.[Employee] AS mgr
     ON usr.managerId = mgr.id
)
SELECT * FROM UserCTE  order by id; 
Другие вопросы по тегам