Гость
Map
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как создать рекурсивный запрос SQL Oracle? / 1 сообщений из 1, страница 1 из 1
05.04.2021, 20:35
    #40060000
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать рекурсивный запрос SQL Oracle?
Здравствуйте)

Дано три таблицы:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
--Таблица каталога продуктов
CREATE TABLE catalog (cid NUMBER PRIMARY KEY, -- id раздела
par_cid NUMBER REFERENCES catalog, -- ссылка на родительский раздел
rname varchar2(400), -- наименование раздела
rdescr varchar2(4000), -- описание
rcdate DATE -- дата создания
);
 
--Таблица продуктов
CREATE TABLE products (pid NUMBER PRIMARY KEY, -- id продукта
rcid NUMBER REFERENCES catalog, -- ссылка на каталог
pname varchar2(500), -- наименование продукта
pdescr varchar2(4000), -- спецификация
punit NUMBER REFERENCES units, -- единица измерения
pper NUMBER REFERENCES persons -- ответственный
);
 
--Таблица движения продуктов
CREATE TABLE records (rpid NUMBER REFERENCES products, -- продукт
rdate DATE, -- дата операции
incoming varchar2(2) DEFAULT '1', -- поступление '1', расход '0'
quantity NUMBER, -- количество
rate NUMBER -- цена в рублях
);



Требуется написать sql запрос для вывода примерно в таком виде:

<Наименование раздела каталога уровня1> || Поступление. Руб. || Расход. Руб
...
<Наименование раздела каталога уровня(K-1)> || Поступление. Руб. || Расход. Руб
<Наименование раздела каталога уровня(K)> || Поступление. Руб. || Расход. Руб
<Наименование Продукта1 этого раздела> || Поступление. Руб. || Расход. Руб || Поступление. Количество || Расход. Количество || Остаток
...
<Наименование ПродуктаN этого раздела> || Поступление. Руб. || Расход. Руб || Поступление. Количество || Расход. Количество || Остаток
<Наименование раздела каталога уровня(K)> || Поступление. Руб. || Расход. Руб
<Наименование Продукта1 этого раздела> || Поступление. Руб. || Расход. Руб || Поступление. Количество || Расход. Количество || Остаток
...
<Наименование ПродуктаN этого раздела> || Поступление. Руб. || Расход. Руб || Поступление. Количество || Расход. Количество || Остаток
<Наименование раздела каталога уровня1> || Поступление. Руб. || Расход. Руб
... и так далее аналогично

Расчет для разделов должен выполняться в соответствии с иерархией. Количество уровней иерархии не ограничено.

Я написал следующий код для создания недостающих таблиц и заполнения всех таблиц данными:

Код: plsql
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.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
--units - Таблица "единиц измерения"
CREATE TABLE units (
    Id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,     --Идентификатор units (Автоматическая нумерация, первичный ключ)
    Unit varchar2(150) NOT NULL                                 --Название units
);
 
--Persons - Таблица "Сотрудники"
CREATE TABLE Persons (
    Id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,     --Идентификатор сотрудника (Автоматическая нумерация, первичный ключ)
    Name varchar2(150) NOT NULL                                 --ФИО сотрудника
);
 
--Данные Persons - Таблица "Сотрудники"
BEGIN
INSERT INTO Persons (Name) VALUES ('Иванов И. Г.');
INSERT INTO Persons (Name) VALUES ('Смолин А. С.');
INSERT INTO Persons (Name) VALUES ('Панасенко С. Н.');
INSERT INTO Persons (Name) VALUES ('Поповский М. Ф.');
INSERT INTO Persons (Name) VALUES ('Васильев М. С.');
INSERT INTO Persons (Name) VALUES ('Ткаченко И. В.');
END;
 
--Данные units - Таблица "единиц измерения"
INSERT INTO units (Unit) VALUES ('Шт.');
 
--Данные catalog - Таблица каталога продуктов
BEGIN
INSERT INTO catalog VALUES (1, NULL, 'Каталог', 'Описание Каталог', TIMESTAMP '2021-01-20 7:55:00');
 
INSERT INTO catalog VALUES (2, 1, 'Стройматериалы', 'Описание Стройматериалы', TIMESTAMP '2021-01-21 7:55:00');
INSERT INTO catalog VALUES (3, 1, 'Сантехника', 'Описание Сантехника', TIMESTAMP '2021-01-22 7:55:00');
INSERT INTO catalog VALUES (4, 1, 'Электротовары ', 'Описание Электротовары', TIMESTAMP '2021-01-23 7:55:00');
BEGIN
INSERT INTO catalog VALUES (5, 2, 'Штукатурки', 'Описание Штукатурки', TIMESTAMP '2021-01-24 7:55:00');
INSERT INTO catalog VALUES (6, 2, 'Грунтовки', 'Описание Грунтовки', TIMESTAMP '2021-01-25 7:55:00');
 
INSERT INTO catalog VALUES (7, 3, 'Ванны ', 'Описание Ванны', TIMESTAMP '2021-01-26 7:55:00');
INSERT INTO catalog VALUES (8, 3, 'Унитазы', 'Описание Унитазы', TIMESTAMP '2021-01-27 7:55:00');
 
INSERT INTO catalog VALUES (9, 4, 'Удлинители', 'Описание Удлинители', TIMESTAMP '2021-01-28 7:55:00');
INSERT INTO catalog VALUES (10, 4, 'Инструменты', 'Описание Инструменты', TIMESTAMP '2021-01-29 7:55:00');
END;
 
--Данные products - Таблица продуктов
BEGIN
INSERT INTO products VALUES (1, 5, 'Штукатурка1', 'Спецификация Штукатурка1', 1, 1);
INSERT INTO products VALUES (2, 5, 'Штукатурка2', 'Спецификация Штукатурка2', 1, 2);
 
INSERT INTO products VALUES (3, 6, 'Грунтовка1', 'Спецификация Грунтовка1', 1, 3);
INSERT INTO products VALUES (4, 6, 'Грунтовка2', 'Спецификация Грунтовка2', 1, 4);
 
INSERT INTO products VALUES (5, 7, 'Ванна1', 'Спецификация Ванна1', 1, 5);
INSERT INTO products VALUES (6, 7, 'Ванна2', 'Спецификация Ванна2', 1, 6);
 
INSERT INTO products VALUES (7, 8, 'Унитаз1', 'Спецификация Унитаз1', 1, 1);
INSERT INTO products VALUES (8, 8, 'Унитаз2', 'Спецификация Унитаз2', 1, 2);
 
INSERT INTO products VALUES (9, 9, 'Удлинитель1', 'Спецификация Удлинитель1', 1, 3);
INSERT INTO products VALUES (10, 9, 'Удлинитель2', 'Спецификация Удлинитель2', 1, 4);
 
INSERT INTO products VALUES (11, 10, 'Инструмент1', 'Спецификация Инструмент1', 1, 5);
INSERT INTO products VALUES (12, 10, 'Инструмент2', 'Спецификация Инструмент2', 1, 6);
END;



Вывел все каталоги:

Код: plsql
1.
2.
3.
4.
5.
SELECT cid, par_cid, rname
FROM catalog
START WITH par_cid IS NULL
CONNECT BY PRIOR cid = par_cid
ORDER BY cid;



Глубже в рекурсию не знаю, как написать запрос. Можете подсказать, как дальше?
...
Рейтинг: 0 / 0
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как создать рекурсивный запрос SQL Oracle? / 1 сообщений из 1, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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