|
|
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
Схема упрощенная, но в целом так: Есть таблица "карточка груза", характеризующая груз и его движение. Данная карточка может быть типа "автомобиль", "вагон" и "склад". Поля, скажем, такие: Код: sql 1. 2. 3. 4. 5. Например, какой-то груз приехал автомобилем, затем переместился на склад. Требуется определить транспорт, на котором прибыл груз. Это просто - имеем карточку груза на складе, обращаемся к полю id_поставки (это ссылка на такую же карточку) и смотрим ее тип - 'auto'. По полю id_автомобиля определяем автомобиль. Но ситуация усложняется, если груз несколько раз перемещали со склада на склад, соответственно, образуется цепочка карточек, где первой будет карточка автомобиля, затем несколько карточек склада до последней. А нужно определить автомобиль, которым прибыл груз изначально. И вот нужно раскрутить всю цепочку, пока не встретишь транспортное средство. Можно ли это сделать с помощью хранимой функции или процедуры? И как совместить вызов процедуры внутри SQL-запроса, если например там список карточек склада, и нужно вывести список транспортных средств для них - какие-то определятся сразу, а другие нужно вытаскивать через рекурсию, и выдать это все одним списком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 02:25 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 04:18 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
Не помешал бы уникальный ид груза. А если id карточки автоинкрементный (позволяет сортировать карточки в порядке перемещения), задача становится тривиальной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 05:26 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
982183, сразу скажу, на самом деле структура немного посложнее, чем дерево родитель-потомок. На одну карточку склада может приходить много карточек вагонов и авто. Т.е. структура не один-ко-многим, а многие-ко-многим, где существует 3 таблицы: карточка1 карточка2 таблица_взаимосвязи (ссылка_на_карточку_1_id, ссылка_на_карточку_2_id). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 05:31 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 05:35 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
svnvladсразу скажу, на самом деле структура немного посложнее, чем дерево родитель-потомок. На одну карточку склада может приходить много карточек вагонов и авто. Ну так ты сначала выведи цепочку cargo_card А потом уже смотри какие ТС принимали участие в членах этой цепочки. Структуру первичной информации ты дал. Кода нарисуешь структуру необходимого отчета, то и тебе станет понятней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 05:47 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
svnvladА нужно определить автомобиль, которым прибыл груз изначально. Ну так для этого сначала надо определить первое cargo_card этого груза. svnvladИ вот нужно раскрутить всю цепочку, пока не встретишь транспортное средство. А вот это непонятно. Бывают грузы без ТС? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 05:53 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
svnvladнужно раскрутить всю цепочку, пока не встретишь транспортное средство.Реализация зависит в первую очередь от версии сервера. Если это 8+ - то повезло, он поддерживает рекурсивные CTE, и можно всё реализовать одним запросом. Если нет - только хранимая процедура. svnvladМожно ли это сделать с помощью хранимой функции или процедуры?Да, можно. Только процедурой. Функции в MySQL не могут быть рекурсивными. svnvladкак совместить вызов процедуры внутри SQL-запроса, если например там список карточек склада, и нужно вывести список транспортных средств для них - какие-то определятся сразу, а другие нужно вытаскивать через рекурсию, и выдать это все одним списком.Процедуру нельзя использовать в качестве источника данных запроса. Её можно использовать только как самостоятельный запрос - получат от неё готовый набор записей либо формировать в ней (временную) таблицу с подготовленными данными, которые затем использовать в запросе. Чаще используется первый подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 07:28 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
982183svnvladА нужно определить автомобиль, которым прибыл груз изначально. Ну так для этого сначала надо определить первое cargo_card этого груза. svnvladИ вот нужно раскрутить всю цепочку, пока не встретишь транспортное средство. А вот это непонятно. Бывают грузы без ТС? Бывают грузы, перемещаемые со склада на другой склад. Но изначально на первый склад он приезжает транспортным средством. Нужно раскрутить до самого начала, на каком транспортном средстве он попал на первый склад. Нужно, чтобы в верхней сетке были карточки склада, а в нижней - detail - список транспортных средств, которыми этот груз прибыл. Отображаться должен не предыдущий склад, а именно транспорт. Хотя по структуре склад равноценен транспорту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 07:29 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
982183svnvladсразу скажу, на самом деле структура немного посложнее, чем дерево родитель-потомок. На одну карточку склада может приходить много карточек вагонов и авто. Ну так ты сначала выведи цепочку cargo_card Вопрос в том и состоит, как вывести (раскрутить) эту цепочку. Это рекурсия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 08:01 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
Суть задачи такова: на картинке прямоугольник "Входящие ТС" - отобразить транспортные средства. Не то же самое, что "Входящие источники". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 08:15 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
svnvladВопрос в том и состоит, как вывести (раскрутить) эту цепочку. Это рекурсия. 982183Посмотри вот это 7488767 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 08:52 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
То, что ты называешь "карточка груза" скорее всего есть "этап доставки" Соответственно тебе нужно имея на входе запроса конечный "этап доставки"/"карточка груза" т.е cargo_card.id Получить все предшествующие id из transhipment.from_cargo_card_id А потом подцепить характеристики транспорта из соответствующих таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 09:01 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
Другое дело, что на этапах происходит объединение и очевидно разъединение партий. Понятие "номенклатура" я у тебя не вижу. И как это реализовано - пока не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 09:04 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
На последней картинке ты решаешь задачу "какие транспорта участвовали в доставке", а не тот транспорт который был в первом этапе авторА нужно определить автомобиль, которым прибыл груз изначально В любом случае надо сначала определить список этапов, а потом подобрать транспорта из соответствующих таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 09:20 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
982183, карточка груза - это таблица cargo_card на желтой схеме. Упоминание о самой номенклатуре груза идет через поле contract_cargo_sub_id - там длинная связка таблиц, которая в конце концов приводит к cargo_nomenclature. Но это не важно. Так же как и какой транспорт. Весь вопрос - как организовать технически рекурсию cargo_card.id -> trasshimpent.to_cargo_card_id -> transshipment.from_cargo_card_id -> cargo_card.id -> trasshimpent.to_cargo_card_id -> transshipment.from_cargo_card_id -> и т.д. До тех пор, пока не будет cargo_card.object_type IN ('auto', 'wagon'). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 11:02 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
982183svnvladВопрос в том и состоит, как вывести (раскрутить) эту цепочку. Это рекурсия. 982183Посмотри вот это 7488767 Это я пробежал, там же описывается для случая дерева, когда один родитель и много наследников. А здесь наоборот, скорее, много родителей и несколько наследников (многие-ко-многим). Хотя попробую, конечно, те процедуры адаптировать для многих-ко-многим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 11:05 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
svnvladА здесь наоборот, скорее, много родителей и несколько наследников (многие-ко-многим). авторсразу скажу, на самом деле структура немного посложнее, чем дерево родитель-потомок. На одну карточку склада может приходить много карточек вагонов и авто. Т.е. структура не один-ко-многим, а многие-ко-многим, где существует 3 таблицы: Нет у тебя многие-ко-многим в описываемом процессе. авторкарточка1 карточка2 таблица_взаимосвязи (ссылка_на_карточку_1_id, ссылка_на_карточку_2_id). Рассматривай таблицу связей как единственную таблицу, описывающую иерархию. Возможно перевернутую (если я правильно понял) (если у тебя есть объединение партий) Если есть и разукомплектовка партий, то да, есть многие ко многим. Но из второй картинки это не следует. А таблицу "карточек" и ТС как дополнительные двухуровневые справочники. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 14:41 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2018, 03:48 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
svnvladМожно ли это сделать с помощью хранимой функции или процедуры? Можно, с помощью процедуры. авторИ как совместить вызов процедуры внутри SQL-запроса, если например там список карточек склада, и нужно вывести список транспортных средств для них - какие-то определятся сразу, а другие нужно вытаскивать через рекурсию, и выдать это все одним списком. Пишешь процедуру, в ней готовишь все данные, потом выводишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 10:42 |
|
||
|
Можно ли сделать рекурсию в SQL-запросе?
|
|||
|---|---|---|---|
|
#18+
авторМожно ли сделать рекурсию в SQL-запросе? https://dev.mysql.com/doc/refman/8.0/en/with.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:09 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39688901&tid=1829638]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 135ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...