Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle APEX Новый топик    Ответить
 Как создать рекурсивный запрос SQL Oracle?  [new]
eliasum
Member

Откуда:
Сообщений: 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> || Поступление. Руб. || Расход. Руб
... и так далее аналогично

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

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

--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;


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

SELECT cid, par_cid, rname
FROM catalog
START WITH par_cid IS NULL
CONNECT BY PRIOR cid = par_cid
ORDER BY cid;


Глубже в рекурсию не знаю, как написать запрос. Можете подсказать, как дальше?
5 апр 21, 20:35    [22304780]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle APEX Ответить