У меня есть следующие данные, чтобы найти таблицу l oop.
:
CREATE TABLE tblLoop
(
person1 varchar(20),
person2 varchar(20)
);
INSERT INTO tblLoop VALUES('A','B'),('A','C'),('A','D'),
('B','E'),('B','F'),
('D','G'),('D','H'),
('F','i'),
('G','J'),
('i','A'),
('J','D');
Редактировать: Добавлено еще несколько значений
INSERT INTO tblLoop VALUES('X','Y'),('X','Z'),('Z','X'),('Y','W');
Просмотр записей например:
![enter image description here](https://i.stack.imgur.com/pMxGt.png)
Примечание : существует возможность множества деревьев, как указано выше, нам нужно найти все деревья l oop данные.
Требование: мне нужно найти лиц, которые составляют oop. Для примера в приведенных данных мы нашли 2 L oop:
L oop 1: A
, связанных с B
, связанных с F
, связанных с i
, связанных с A
.
L oop 2: A
, связанный с D
, связанный с G
, связанный с J
, связанный с D
.
Ожидаемый результат:
LoopFound
--------------------
A->B->F->i->A
A->D->G->J->D
X->Z->X
Моя попытка:
;WITH CTE_Loop AS
(
SELECT t.Person1,t.Person2,
CONVERT(VARCHAR(500), t.Person1 + '->' + t.Person2) AS [Loop],
0 AS FoundFlag
FROM tblLoop t
UNION ALL
SELECT t.Person1,t.Person2,
CONVERT(VARCHAR(500), cte.[Loop] +'->'+t.Person2) AS [Loop],
CASE WHEN CHARINDEX(t.Person2, cte.[Loop]) != 0 THEN 1 ELSE 0 END AS FoundFlag
FROM CTE_Loop cte
INNER JOIN tblLoop t ON t.Person1 = cte.Person2
WHERE cte.FoundFlag = 0 AND t.Person1 <> '-' AND t.Person2 <> '-'
)
SELECT [Loop] AS LoopFound
FROM CTE_Loop
WHERE FoundFlag = 1
GROUP BY [Loop];