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

Откуда:
Сообщений: 18
Доброй ночи!

Помогите пожалуйста решить проблему:

У меня есть таблица - "tbl"


Код Отключение
1 ---------2
1 ---------3
2 ---------3
3 ---------4
7 ---------6

Если например выбираю:
Select Отключение from tbl Where Код=1 group by Отключение
То как вывести 2, 3, 4?
(Получается цепная реакция, нужно вывести все елементы в этой цепочке)
31 янв 14, 02:05    [15497920]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Добрый Э - Эх
Guest
Рекурсивный СТЕ тебе в помощь. Произвольный граф обработать им не получится, но дерево - как нечего делать.
31 янв 14, 05:12    [15498054]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
aleks2
Guest
Добрый Э - Эх
Рекурсивный СТЕ тебе в помощь. Произвольный граф обработать им не получится,

Зато тупой while справится.
31 янв 14, 05:26    [15498057]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Ulixes
Member

Откуда:
Сообщений: 18
WITH CTE(Код, Отключение, NestingLevel)  
AS
(
	SELECT P.Код, P.Отключение, 1 FROM tbl AS P WHERE Код = 1
	UNION ALL
	SELECT P.Код, P.Отключение, (NestingLevel + 1) FROM tbl AS P
		INNER JOIN CTE ON CTE.Код = P.Отключение
)

SELECT * FROM CTE OPTION(MAXRECURSION 10000)


Находит только 1, 2, 3 (первый уровень) и выдает ошибку "The statement terminated. The maximum recursion 100 has been exhausted before statement completion." 1 связана с 2 -> 3 и 1 связана с 3 -> 4, тоесть 3, 4 тоже толжно выводить. Без групировки 1, 2, 3, 3, 4. Мне нужно чтоб выводил все элементы на всех уровнях.
31 янв 14, 12:04    [15499457]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
dma_caviar
Member

Откуда: https://itproduct.ru
Сообщений: 2361
Ulixes,

Вохможно в обратную сторону рекурсию нужно делать или не теми параметрами цепляете дочерние записи.
31 янв 14, 12:07    [15499479]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Добрый Э - Эх
Guest
Ulixes,

цикл случился в твоем графе, а обработки этой ситуации ты не предусмотрел. Вот рекурсия по достижении умолчательного числа итерация и выпадает.
31 янв 14, 12:09    [15499502]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
dma_caviar
Member

Откуда: https://itproduct.ru
Сообщений: 2361
Или вы привели не полный пример, и в таблице есть зацикливание.
31 янв 14, 12:09    [15499505]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Ulixes
WITH CTE(Код, Отключение, NestingLevel)  
AS
(
	SELECT P.Код, P.Отключение, 1 FROM tbl AS P WHERE Код = 1
	UNION ALL
	SELECT P.Код, P.Отключение, (NestingLevel + 1) FROM tbl AS P
		INNER JOIN CTE ON CTE.Код = P.Отключение
)

SELECT * FROM CTE OPTION(MAXRECURSION 10000)


Находит только 1, 2, 3 (первый уровень) и выдает ошибку "The statement terminated. The maximum recursion 100 has been exhausted before statement completion." 1 связана с 2 -> 3 и 1 связана с 3 -> 4, тоесть 3, 4 тоже толжно выводить. Без групировки 1, 2, 3, 3, 4. Мне нужно чтоб выводил все элементы на всех уровнях.


при (MAXRECURSION 10000) пишет "The maximum recursion 100 has been exhausted " ?
31 янв 14, 12:16    [15499570]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Ulixes
Member

Откуда:
Сообщений: 18
Winnipuh

при (MAXRECURSION 10000) пишет "The maximum recursion 100 has been exhausted " ?

Нет, пишет The statement terminated. The maximum recursion 1000 has been exhausted before statement completion.
31 янв 14, 12:19    [15499596]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Ulixes
Winnipuh
при (MAXRECURSION 10000) пишет "The maximum recursion 100 has been exhausted " ?

Нет, пишет The statement terminated. The maximum recursion 1000 has been exhausted before statement completion.


так 100, 1000 или как в параметре указано (10000)?

как подсказали уже, цикл у вас где-то
31 янв 14, 12:21    [15499617]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Ulixes
Member

Откуда:
Сообщений: 18
Подскажите пожалуйста как это сделать запрос чтобы выводило правильно.
31 янв 14, 12:21    [15499618]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Ulixes
Подскажите пожалуйста как это сделать запрос чтобы выводило правильно.


запрос уже дали, он выведет, но если НЕТ ЦИКЛОВ, т.е. если граф - дерево.
А если у него есть циклы, то тогда сначала продумайте задачу, что вы хотите получить.
Или если циклы есть, а их не должно быть по идее, то выловите и уничтожьте
и потом см. запрос.
31 янв 14, 12:24    [15499635]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Ulixes
Member

Откуда:
Сообщений: 18
Winnipuh,

При maxrecursion 100, 100, 10000 выдает ошибку переполнения.
31 янв 14, 12:24    [15499638]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
Ulixes
Подскажите пожалуйста как это сделать запрос чтобы выводило правильно.
Добавьте текстовое поле с именем, например, Path, и на каждой итерации проверяйте есть текущий узел в списке или ещё нет.
В список каждый раз добавляйте через разделитель ID текущего узла.

Тогда зацикливания не будет
31 янв 14, 12:24    [15499646]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
Кстати, Добрый Э - Эх, печёнкой чую, что рекурсивное CTE и для произвольных графов годится
31 янв 14, 12:26    [15499662]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Добрый Э - Эх
Guest
Ulixes,

Во-первых, дерево ты строишь не в ту сторону. на твоих тестовых данных из первого топика запрос должен иметь такой вид: тынц.
Во-вторых, скорее всего у тебя есть или цикл в данных, или цепочка событий, длиннее заданного ограничения уровней рекурсии.
31 янв 14, 12:27    [15499667]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Добрый Э - Эх
Guest
iap,

если грамотно подойти к вопросу выявления циклов, а также принятию решений по какой из веток графа идти в случае наличия нескольких путей из узла A в узел B - ограничений на тип графа, конечно же, нет. Если же этим ничем не заморачиваться, то дерево - предел мечтаний.
31 янв 14, 12:30    [15499700]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Ulixes
Member

Откуда:
Сообщений: 18
Добрый Э - Эх
Ulixes,

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


Сделал так:

with tbl1(Код, Отключение) as 
(select * from tbl
 )
,
CTE(Код, Отключение, NestingLevel) 
AS
(
	SELECT P.Код, P.Отключение, 1 FROM tbl AS P WHERE Код = 1
	UNION ALL
	SELECT P.Код, P.Отключение, (NestingLevel + 1) FROM tbl AS P
		INNER JOIN CTE ON P.Код = CTE.Отключение
	
)

SELECT * FROM CTE OPTION(MAXRECURSION 10000)


Вроде находит, но все равно выдает The statement terminated. The maximum recursion 100 has been exhausted before statement completion.
31 янв 14, 12:56    [15499919]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Добрый Э - Эх
Guest
ну, вопрос-то про циклы и длинные цепочки остается открытым.
31 янв 14, 13:00    [15499948]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Ulixes
Member

Откуда:
Сообщений: 18
Winnipuh
Ulixes
Подскажите пожалуйста как это сделать запрос чтобы выводило правильно.


запрос уже дали, он выведет, но если НЕТ ЦИКЛОВ, т.е. если граф - дерево.
А если у него есть циклы, то тогда сначала продумайте задачу, что вы хотите получить.
Или если циклы есть, а их не должно быть по идее, то выловите и уничтожьте
и потом см. запрос.


Мне нужно получить все елементы которие имеют связь с заданым (напрямую, через элемент или через цепочку элемент).
Если 1 ссылается на 2 а 2 на 3, 3 на 4 итд.. То нужно при Where=1. Должно вывести 2, 3, 4. (один элемент может ссылается на несколько)
31 янв 14, 13:13    [15500062]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
dma_caviar
Member

Откуда: https://itproduct.ru
Сообщений: 2361
> Если 1 ссылается на 2 а 2 на 3, 3 на 4 итд

а если потом 4 ссылается на 1, то что должно в итоге отобразиться?
31 янв 14, 13:43    [15500287]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Ulixes
Member

Откуда:
Сообщений: 18
dma_caviar
> Если 1 ссылается на 2 а 2 на 3, 3 на 4 итд

а если потом 4 ссылается на 1, то что должно в итоге отобразиться?


Все с 1 или без. Мне нужно, если например есть прибор1, он сломался и потребует ремонта. Но, он связан с прибором 2. И если не работает первый то второй тоже отключается. А второй имеет тоже связи и если он отключается то отключаются все те с которыми он имеет связь итд... Мне нужно узнать какие приборы отключатся при отключении заданого (например 1). Можно ето будет потом все сгруппировать?
31 янв 14, 13:54    [15500371]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ulixes
Все с 1 или без.

А как сервер то узнает о цикле ?

Ulixes
Мне нужно, если например есть прибор1, он сломался и потребует ремонта. Но, он связан с прибором 2. И если не работает первый то второй тоже отключается.

А как тогда получается цикл, если связи иерерахические ?
Если 2ой зависит от 1го, то 3ий от 2го, 4ый от 3го, то почему 1ый зависит от 4го, если 4ый и так зависит от 1го ?
31 янв 14, 14:09    [15500480]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
dma_caviar
Member

Откуда: https://itproduct.ru
Сообщений: 2361
Смотрите, у вас если сломался 1й прибор, значит отключается 2й, если сломался й2, значит отключаем 3й, если сломался 3й, отлючаем 4й, если ломался 4й, отключаем 1й, если сломался 1й прибор, значит отключается 2й, если сломался й2, значит отключаем 3й, если сломался 3й, отлючаем 4й, если ломался 4й, отключаем 1й, если сломался 1й прибор, значит отключается 2й, если сломался й2, значит отключаем 3й, если сломался 3й, отлючаем 4й, если ломался 4й, отключаем 1й, если сломался 1й прибор, значит отключается 2й, если сломался й2, значит отключаем 3й, если сломался 3й, отлючаем 4й, если ломался 4й, отключаем 1й, если сломался 1й прибор, значит отключается 2й, если сломался й2, значит отключаем 3й, если сломался 3й, отлючаем 4й, если ломался 4й, отключаем 1й, если сломался 1й прибор, значит отключается 2й, если сломался й2, значит отключаем 3й, если сломался 3й, отлючаем 4й, если ломался 4й, отключаем 1й, если сломался 1й прибор, значит отключается 2й, если сломался й2, значит отключаем 3й, если сломался 3й, отлючаем 4й, если ломался 4й, отключаем 1й, если сломался 1й прибор, значит отключается 2й, если сломался й2, значит отключаем 3й, если сломался 3й, отлючаем 4й, если ломался 4й, отключаем 1й

складывается ощущение что что-то не то?))
31 янв 14, 14:22    [15500582]     Ответить | Цитировать Сообщить модератору
 Re: Вывод всех елементов по графу  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
declare @tbl table ([Код] int,[Отключение] int)
insert into @tbl values
(1,2),(1,3),(2,3),(3 ,4) ,(7 ,6),(4,1)


;with cte([Код],[Child],[Отключение],step) as
(select [Код] ,[Отключение],'['+cast([Отключение] as varchar(max)) +']',1 as step
 from @tbl where [Код]=1
union all
select cte.[Код] ,t.[Отключение],cte.[Отключение] +'['+CAST(t.[Отключение] as varchar(10))+']', cte.step+1
 from @tbl t
join cte on  t.[Код] = cte.[Child]
and cte.[Отключение] not like '%'+'['+CAST(t.[Отключение] as varchar(10))+']'+'%'
 )
select * 
from  (select distinct '['+CAST([Код] as varchar(10))+']' as [Код] from @tbl union select distinct '['+CAST([Отключение] as varchar(10))+']'  as [Код] from @tbl) t0
where exists(select * from cte where   cte.[Отключение] like '%'+ t0.Код+'%')
31 янв 14, 14:23    [15500592]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить