powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Рекурсия с left join
6 сообщений из 6, страница 1 из 1
Рекурсия с left join
    #40037289
Bereteli
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Помогите написать рекурсию.
Много раз пытался через with сделать, но что-то мне не дается нормально ее замкнуть.

Сама условие вроде несложное, но еще ни разу не писал рекурсии.
У товара есть спецификация, если он состоит из более чем 1 запчасти; каждая спецификации это своего рода комбо-код в котором хранятся составные части товара.
Есть 2 таблицы.
Таблица 1: Товар, Спецификация
Таблица 2 : Спецификация, товар

В Таблице 1 находятся все товары, которые имеют спецификацию, необходимо подключить к ней Таблицу 2, что бы увидеть из чего она состоит. Когда получен результат нужно полученный столбик Таблица2.Товар проверить на наличие спецификации (т.е. составной это элемент или же конечный без спецификации). Если же составной то добавить его ниже, и к нему подключить спецификацию из Таблицы 1, а потом подключить товара по спецификации из Таблицы 2.
Цикл заканчивается когда возвращаемый товар не имеет спецификации.
...
Рейтинг: 0 / 0
Рекурсия с left join
    #40037321
Grim08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понятно зачем вас здесь рекурсия?
Ваша задача решается:
Код: sql
1.
2.
3.
SELECT t1.[Товар], t1.[Спецификация], t2.[Составные]
FROM [Таблица 1] AS t1
JOIN [Таблица 2] AS t2 ON t2.[Спецификация] = t1.[Спецификация]
...
Рейтинг: 0 / 0
Рекурсия с left join
    #40037352
Bereteli
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Grim08,

Мне нужна эта рекурсия для создания иерархии. Я написал для примера 2 составные. Мне нужно что бы он продолжал раскрывать это до тех пор пока не останутся обычные детали.
По вашему примеру он раскроет это 1 раз и я получу первые составные, а что мне делать если в составную часть входит еще спецификация?
...
Рейтинг: 0 / 0
Рекурсия с left join
    #40037358
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bereteli
Много раз пытался через with сделать, но что-то мне не дается нормально ее замкнуть.
Так напишите свой вариант, что не получается?
Покажите структуру таблиц, запрос, сообщение об ошибке, или указание на то, что вам не нравится в полученном результате. Не надо только эксельные исходники из задания постить, тут же не "выполнение курсовиков за деньги"
...
Рейтинг: 0 / 0
Рекурсия с left join
    #40037379
Grim08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При вашем хранении, при добавлении записей ни чего не изменится.
Рекурсия была бы нужна если бы вы хранили данные в одной таблице например
Товар | Составные
Машина | Автомотор
Машина | Корпус
Автомотор | Цилиндр
Цилиндр | 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.
DROP TABLE IF EXISTS [#Товар 1];
CREATE TABLE [#Товар 1](
	[Товар] VARCHAR(100) NOT NULL,
	[Спецификация] INT NULL
);
INSERT INTO [#Товар 1]([Товар], [Спецификация])
SELECT [Товар], [Спецификация]
FROM (VALUES ('Машина', 1)
			,('Холодильник', 2)
			,('Автомотор', 3)
			,('Холодильный мотор', 4)
			,('Цилиндры', NULL)
			,('Коленвал', NULL)
			,('Ротор', NULL)
			,('Фрион', NULL)) AS t([Товар], [Спецификация]);

DROP TABLE IF EXISTS [#Товар 2];
CREATE TABLE [#Товар 2](
	[Спецификация] INT NOT NULL,
	[Составные] VARCHAR(100) NOT NULL
);

INSERT INTO [#Товар 2]([Спецификация], [Составные])
SELECT [Спецификация], [Составные]
FROM (VALUES (1, 'Автомотор')
            ,(1, 'Корпус')
            ,(2, 'Корпус')
            ,(2, 'Холодильный мотор')
            ,(3, 'Цилиндры')
            ,(3, 'Коленвал')
            ,(4, 'Ротор')
            ,(4, 'Фрион')
) AS t([Спецификация], [Составные]);

WITH CTE AS (SELECT t1.[Товар], t1.[Спецификация], t2.[Составные]
             FROM [#Товар 1] AS t1
             JOIN [#Товар 2] AS t2 ON t2.[Спецификация] = t1.[Спецификация]
             WHERE t1.[Товар] NOT IN (SELECT [Составные] FROM [#Товар 2])
             UNION ALL
             SELECT t1.[Товар], t1.[Спецификация], t2.[Составные]
             FROM [#Товар 1] AS t1
             JOIN [#Товар 2] AS t2 ON t2.[Спецификация] = t1.[Спецификация]
             JOIN CTE AS c ON c.Составные = t1.Товар)

SELECT [Товар], [Спецификация], [Составные]
FROM CTE;



Но еще раз, в данном случае это извращение.
...
Рейтинг: 0 / 0
Рекурсия с left join
    #40037664
Bereteli
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.[Спецификация]
)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Рекурсия с left join
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]