|
Рекурсия с left join
|
|||
---|---|---|---|
#18+
Добрый день. Помогите написать рекурсию. Много раз пытался через with сделать, но что-то мне не дается нормально ее замкнуть. Сама условие вроде несложное, но еще ни разу не писал рекурсии. У товара есть спецификация, если он состоит из более чем 1 запчасти; каждая спецификации это своего рода комбо-код в котором хранятся составные части товара. Есть 2 таблицы. Таблица 1: Товар, Спецификация Таблица 2 : Спецификация, товар В Таблице 1 находятся все товары, которые имеют спецификацию, необходимо подключить к ней Таблицу 2, что бы увидеть из чего она состоит. Когда получен результат нужно полученный столбик Таблица2.Товар проверить на наличие спецификации (т.е. составной это элемент или же конечный без спецификации). Если же составной то добавить его ниже, и к нему подключить спецификацию из Таблицы 1, а потом подключить товара по спецификации из Таблицы 2. Цикл заканчивается когда возвращаемый товар не имеет спецификации. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2021, 23:01 |
|
Рекурсия с left join
|
|||
---|---|---|---|
#18+
Не понятно зачем вас здесь рекурсия? Ваша задача решается: Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 07:16 |
|
Рекурсия с left join
|
|||
---|---|---|---|
#18+
Grim08, Мне нужна эта рекурсия для создания иерархии. Я написал для примера 2 составные. Мне нужно что бы он продолжал раскрывать это до тех пор пока не останутся обычные детали. По вашему примеру он раскроет это 1 раз и я получу первые составные, а что мне делать если в составную часть входит еще спецификация? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 10:01 |
|
Рекурсия с left join
|
|||
---|---|---|---|
#18+
Bereteli Много раз пытался через with сделать, но что-то мне не дается нормально ее замкнуть. Покажите структуру таблиц, запрос, сообщение об ошибке, или указание на то, что вам не нравится в полученном результате. Не надо только эксельные исходники из задания постить, тут же не "выполнение курсовиков за деньги" ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 10:25 |
|
Рекурсия с left join
|
|||
---|---|---|---|
#18+
При вашем хранении, при добавлении записей ни чего не изменится. Рекурсия была бы нужна если бы вы хранили данные в одной таблице например Товар | Составные Машина | Автомотор Машина | Корпус Автомотор | Цилиндр Цилиндр | NULL У вас же при добавлении товара вносится ссылка на составные, и если составные являются тоже товаром то они попадают в первую таблицу и имеет ссылку на свои составные, как бы вы не вносили данные мой запрос в первом ответе вернет вам то, что нужно. Ну уж если очень хочется освоить рекурсию то вот вам пример для вашей задачи Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
Но еще раз, в данном случае это извращение. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 11:18 |
|
Рекурсия с left join
|
|||
---|---|---|---|
#18+
Grim08, Grim08, Спасибо вам большое за ваши труды. Это практически то, что я хотел написать, но может вас не затруднит мне немного еще помочь. Я взял ваш код, но самому докрутить не выходит, он не идет в цикл. Основная проблема заключается в том, что в первом селекте идет одно соединение, а в юнионе уже на месте [товара] должны оказаться [составные] полученные из первой select'a, причем которые имееют [спецификации]. И дальше в этом же юнионе начинается подстановка которая должна показать [спецификацию] это [составной] и [составную] и отметить шаг 2. Далее тот же принцип, добавить вниз все полученные составные без спецификации. WITH CTE AS (SELECT t1.[Товар], t1.[Спецификация], t2.[Составные], 1 as [шаг] FROM [#Товар 1] AS t1 JOIN [#Товар 2] AS t2 ON t2.[Спецификация] = t1.[Спецификация] UNION ALL SELECT t2.[Составные] (что имеют спецификацию), t3.[Спецификация], t4.[Составные], Шаг+1 as Шаг FROM *** JOIN [#Товар 1] AS t3 ON t3.[Товар] = t2.[Составные] JOIN [#Товар 2] AS t4 ON t4.[Спецификация] = t3.[Спецификация] ) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2021, 12:48 |
|
|
start [/forum/topic.php?fid=46&msg=40037289&tid=1685184]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 277ms |
0 / 0 |