Выдернуть начала цепочек с помощью SQL #794611


#0 by craxx
Имеются цепочки чисел, к примеру, для простоты 1-2-4-8-11 и 3-5-6-7-9-10, представленные в виде таблицы из двух столбцов: Предыдущее    Следующее 1        2 2        4 4        8 8        11 3        5 5        6 6        7 7        9 9        10 Одно и то же число присутствует только в одной цепочке и не повторяется в таблицы больше одного раза Необходимо с помощью SQL-запроса преобразовать ее в следующую таблицу Первое        Текущее 1        1 1        2 1        4 1        8 1        11 3        3 3        5 3        6 3        7 3        9 3        10 Подскажите хотя бы идеи, куда копать.
#1 by Господин ПЖ
обойти через fetch и собрать таблицу какую надо
#2 by craxx
задача-голым sql
#3 by Господин ПЖ
fetch - вроде голее некуда
#4 by МихаилМ
какой диалект sql благородный дон. "голый" - sql . мусье знает толк в извращениях
#5 by craxx
в языке запросов 1с нету fetch
#6 by craxx
для простоты пусть будет язык запросов 1с
#7 by Вафель
через транзитивное замыкание конечно же
#8 by Вафель
задача аналогична найти верхнего родителя
#9 by Вафель
вернее всех родителей
#10 by Господин ПЖ
>в языке запросов 1с нету fetch а причем тут голый sql тогда?
#11 by МихаилМ
причем тут "языке запросов 1с" это и есть "голый" - sql.
#12 by GANR
ограничения на потенциально возможную длину цепочки есть?
#13 by Вафель
#14 by МихаилМ
откуда в результате взялось 1        1 без него задача понятней
#15 by craxx
длина не ограничена
#16 by craxx
не пойдет. необходимо конечное количество запросов.
#17 by craxx
+текст запроса должен быть один для любых цепочек
#18 by DailyLookingOnASunse
Там 2 в степени. Т.е. 10 запросов покрывают 1000 уровней иерархии.
#19 by МихаилМ
вы хоть не поленились и делали заготовку кода запроса с тестовыми данными
#20 by GANR
1С-ным статическим запросом такое не осилить. Там ведь надо искать для каждой цифры первый элемент цепочки. Вот с рекурсивными CTE в скуле еще можно поизворачиваться. И то там системные ограничения на глубину рекурсии могут мешать.
#21 by МихаилМ
легко 1с ным запросом без fetch cte и оконных функций
#22 by GANR
Да!? Длина цепочки-то не ограничена.
#23 by craxx
и как?
#24 by Неверный Параметр И
ISBN 5-93286-125-8, 10 глава
#25 by Неверный Параметр И
Или даже ISBN 13: 978-0-12-369379-2, глава 24
#26 by МихаилМ
да не получится . нужно поле упорядочивания
#27 by NorthWind
Начала цепочек выдернуть несложно. Более сложно собрать в кучку как написано в результате
#28 by Ildarovich
Можно написать запрос фиксированной длины из 100 (с запасом) подзапросов по схеме из ссылки . С его помощью можно обрабатывать цепочки из 2^100 (два в сотой степени) элементов. Это очень большое число. Достаточное для любых, даже теоретических целей. Например, потому, что для записи исходных данных описания такой длинной цепочки не хватит емкости всех имеющихся на Земле жестких дисков. Отсюда Зеттабайт следует, что в конце 2015 года в интернете было 8 зеттабайт, то есть примерно 2^67 байт. Даже при использовании CTE нужно будет использовать принцип из . Матричное умножение, которое лежит в основе указанного способа - известный способ ускорения многих алгоритмов. поле для упорядочивания типа "уровень" - да, оно бы выручило
#29 by craxx
я же написал, последующий номер всегда больше предыдущего и он уникален в пределах колонки
#30 by craxx
>>С его помощью можно обрабатывать цепочки из 2^100 (два в сотой степени) элементов. цепочки линейные, поэтому не 2^100 а ровно 100 и получится, а этого мало.
#31 by Ildarovich
Думаю, вы не поняли сути метода из . Каждый следующий подзапрос в нем удваивает длину выявляемой цепочки. Поэтому если в вашем случае максимальная длина цепочки - 100, то нужно всего 7 подзапросов.
#32 by NorthWind
Берете число1 из простого соединения таблицы самой с собой по таб1.число2=таб2.число1. затем вычитаете из исходной таблицы этот результат. Получаете начала цепочек. В нашем случае это будет 1;2 и 3;5. Но вот как потом все это накрутить так чтобы получить результат - я чет теряюсь.
#33 by craxx
начала цепочек я сам уже выдернул. а дальше, да, транзитивное замыкание, вот как реализовать?
#34 by Ildarovich
Примерно так: Здесь три подзапроса и максимальная длина выявляемых цепочек - 8. Если нужно больше - добавьте в конец нужное число подзапросов по той же логике.
#35 by NorthWind
похоже, никак. Вот здесь похожий пример , надо выдернуть из таблицы всех руководителей (прямых и непрямых) сотрудника, с учетом того что в строке указан табельный номер только непосредственного руководителя, а у того руководителя на вышестоящего руководителя и т.д. Ответ - нельзя.
#36 by NorthWind
точнее, можно, но только для частных случаев. В общем для произвольной длины цепи - нет.
#37 by Ildarovich
+ Напишу на всякий случай готовый запрос для цепочек длиной не более 128:
#38 by Ildarovich
Произвольная длина цепи бывает только в теории. На практике она всегда чем-то ограничена. Хотя бы размером места на диске. Поэтому решение типа , которое легко обобщить на любое РЕАЛЬНОЕ число уровней и говорит о том, что решение имеется.
#39 by Ildarovich
+ Последнее условие нужно переписать так: Смысл условия в том, чтобы из всех связей выделить только те, началом которых являются элементы, не являющиеся концом ни одной связи, кроме связи с самим собой.
#40 by Naf2017
Легко вытянуть все первые, но пары не вытянуть в общем случае
#41 by Ildarovich
Попробуйте запрос из + прежде чем так утверждать. Его можно в консоли запустить, если консоль таблицу значений как параметр принимает.
#42 by NorthWind
можно, но не в общем виде. Будет ограничение на длину цепочки.
#43 by RomanYS
может я задачу не понял. Если есть еще 3я колонка с порядковые номером, то задача не сложна 1. соединением находим начала 2. нумеруем начала 3. соединяем начала и исходную таблицу
#44 by Naf2017
"длиной не более 128" и "в общем виде" это как бы не одно и тоже
#45 by NorthWind
приведите свое решение
#46 by RomanYS
доберусь до компа, напишу
#47 by lock19
"Одно и то же число присутствует только в одной цепочке и не повторяется в таблицы больше одного раза" "1        2 2        4 4 " ???
#48 by Naf2017
он имел ввиду в столбце
#49 by RomanYS
+ можно ли считать таблицу связей упорядоченной (пронумерованной)? Или порядок в примере только для наглядности?
#50 by lock19
Всё. Уже дошло.
#51 by lock19
Нужно получить данные по упорядоченности и убрать пересечения для первого столбца. Далее сопоставлять по данным порядка и величине элементов. Примерно так.
#52 by Ildarovich
С упорством, достойным лучшего применения, хочу донести, где, по моему мнению вы не правы. А если в запрос добавить еще 93 "каскада"? - Это легко сделать прямо сейчас. Это будет статический запрос. Существенно менее длинный по размеру, чем многие запросы в ЗУП. Тогда вы тоже скажете: "длиной не более 1 000 000 000 000 000 000 000 000 000 000" и "в общем виде" это как бы не одно и тоже? Пытаюсь обратить внимание на разницу между математикой, которая имеет дело с абстракциями (конструкциями, не существующими в природе) и программированием, как инженерной дисциплиной, которая позволяет создавать реально работающие системы, построенные из конкретных объектов материального мира для отражения объектов материального мира, число которых при программировании можно считать конечным. Число атомов во Вселенной имеет оценку, выраженную числом с конкретным количеством нулей. Для которого можно посчитать число необходимых каскадов удвоения. Поэтому если исходная задача является задачей программирования, то запрос, построенный по принципу, представленному в , ее, на мой взгляд, решает.
#53 by Ildarovich
Давайте посчитаем ее такой.
#54 by Naf2017
вот и бел гейтс считал, что «640 Кб должно быть достаточно для каждого»
#55 by NorthWind
если исходить из "жизненности", то и курсор может быть неплох, и даже извлечение данных на клиент и получение результата "навигационным методом". Пока строк не сильно много - не страшно :)
#56 by Ildarovich
По словам самого Гейтса, он этого не говорил: _(число). + Пока не соображу, как можно использовать упорядоченность, но было бы очень интересно.
#57 by RomanYS
для упорядоченной(пронумерованной) таблицы будет работать без каких-либо заморочек. Писать запрос лень. Только если Вы будете настаивать что это невозможно).
#58 by ovrfox
create table #Raw(A int, b int) insert #Raw Select 1 ,   2 union all select 2,     4 union all select 4      ,  8 union all select 8     ,   11 union all select 3    ,    5 union all select 5   ,     6 union all select 6  ,      7 union all select 7 ,       9 union all select 9,        10 with cte (a , b ) as ( select a,a as b from #raw tout where not exists (select 1 from #raw tin where tin.b = tout.a) union all select cte.a,tout.b from #raw tout inner join cte on cte.b = tout.a) select * from cte Работает и так
#59 by Вафель
рекурсия чтоли?
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С