Я довольно новичок в PL / SQL, и я борюсь с квестом, который я получаю.
У меня есть юридические и физические лица. Каждое юридическое лицо может иметь несколько физических лиц, и эти физические лица могут быть привязаны к 1 или более субъектам.
- Компания А имеет диспонента № 1 и № 2 и № 3
- Компания Б имеет диспетента № 2 и № 4
- Компания C имеет диспетента № 4
- Компания D имеет диспонента # 5
- Компания E имеет диспонента # 6
- Компания F имеет диспонента # 6
Результат должен показать, какие компании связаны через некоторое несогласие. В действительности отношения более «глубокие» и сложные. В моем примере результат должен выглядеть примерно так:
- Компания A - Группа 1
- Компания B - Группа 1
- Компания C - Группа 1
- Компания D - Группа 2
- Компания E - Группа 3
- Компания F - Группа 3
Пример таблицы в Excel:
Я сделал 3 таблицы:
- SNAPSHOT_FO - содержит FO_CLUID (идентификатор физического лица)
- SNAPSHOT_VAZBA - содержит PO_cluid (идентификатор юридического лица) и FO_cluid. Это таблица отношений.
- ODLITE - содержит FO_CLUID (идентификатор естественного объекта) и KOD (идентификатор группы) - пусто в начале. Должна быть последняя таблица, которую я затем могу присоединить к PO_cluid и получить результат.
CREATE GLOBAL TEMPORARY TABLE tbl_temp
(
F_CL VARCHAR2(255) NULL,
par NUMBER(5) NULL
)
ON COMMIT PRESERVE ROWS;
DECLARE
party NUMBER := 1;
r NUMBER := 1;
BEGIN
FOR CLUID IN (select FO_CLUID from snapshot_fo WHERE ROWNUM =1)
LOOP
INSERT INTO tbl_temp (F_CL,par) VALUES (CLUID,party);
WHILE ( r> 0 )
BEGIN
MERGE INTO tbl_temp tg
USING ((SELECT distinct FO_CLUID from snapshot_vazba where PO_CLUID in (
SELECT distinct PO_CLUID
from snapshot_vazba
where FO_CLUID in (select f_cl from tbl_temp where kod=party)
))
) src
on (tg.FO_cluid =src.FO_cluid)
WHEN NOT MATCHED THEN
INSERT (F_CL, par)
VALUES (src.FO_CLUID, party)
SET r = SQL%ROWCOUNT
END;
INSERT INTO odlite (FO_CLUID, KOD) VALUES (tbl_temp.cluid,tbl_temp.party);
delete from snapshot_fo where fo_cluid in (select fo_cluid from odlite);
truncate table tbl_temp;
party := party + 1;
r := 1;
END Loop;
end ;
/
Тогда я просто присоединю таблицу odlite
ON FO_cluid
к моей таблице PO_cluid
. Но код не работает в данный момент ... и я не знаю другого способа, как это сделать. Если есть какой-то более простой способ, как это сделать, пожалуйста, дайте мне знать:)
PS: мне не разрешено делать временные таблицы в объявлении части из-за ограничений в нашей компании.
Спасибо заблаговременно!
ORACLE SQL РАЗРАБОТЧИК Версия 19.2.1.247