Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проверка на цикличность  [new]
_Murzilka_
Member

Откуда:
Сообщений: 1
Есть таблица Nodes (id int PK, name varchar) и Bond (id int PK, from_node FK, to_node FK). from_node FK, to_node FK - это ссылки на узлы из таблицы Nodes id int PK. То есть превая таблица узлов, вторая таблица их связей. Я в этом новичек, не знаю, как при добавлении связи (Bond) Проверить на цикличность, чтоб не было 3 -> 4->5->3. Это нужно писать триггер на insert? Подскажите.
19 июл 11, 11:00    [10993303]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на цикличность  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
CTE с OPTION (MAXRECURSION, ..), и ловить эксепшн. Если таковой словился - данные с вероятностью, определяемой значением в скобках, зациклены.
19 июл 11, 11:10    [10993397]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на цикличность  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Все циклы при добавлении новой связи (5,3) при условии, что до этого циклов не было
USE tempdb;
CREATE TABLE Bond(ID INT NOT NULL IDENTITY, FromNode INT, ToNode INT);
INSERT Bond(FromNode,ToNode)VALUES
 (1,3)
,(3,8)
,(8,5)
,(2,4)
,(4,5)
,(5,11);

DECLARE @FromNode INT=5, @ToNode INT=3;
WITH CTE(ToNode,P) AS
(
 SELECT @ToNode, CAST(STR(@FromNode,10) AS VARCHAR(MAX))+CAST(STR(@ToNode,10) AS VARCHAR(MAX))
 UNION ALL
 SELECT B.ToNode,CTE.P+CAST(STR(B.ToNode,10) AS VARCHAR(MAX))
 FROM Bond B JOIN CTE ON B.FromNode=CTE.ToNode
 WHERE LEFT(CTE.P,10)<>RIGHT(CTE.P,10)
)
SELECT P FROM CTE WHERE LEFT(CTE.P,10)=RIGHT(CTE.P,10);
??
19 июл 11, 11:58    [10993851]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить