【发布时间】:2020-05-26 00:15:23
【问题描述】:
我对 PL/SQL 还很陌生,我正在为我得到的任务而苦苦挣扎。
我有法律实体和自然实体。每个法人实体可以有一些自然实体,这些自然实体可以绑定到一个或多个实体。
- A 公司有 #1 和 #2 和 #3 的 disponent
- B 公司有 #2 和 #4 的 disponent
- 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(自然实体的 ID)
- SNAPSHOT_VAZBA - 包含 PO_cluid(法人 ID)和 FO_cluid。这是关系表。
- ODLITE - 包含 FO_CLUID(自然实体的 ID)和 KOD(组 ID) - 开头为空。应该是决赛桌,然后我可以加入 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
【问题讨论】:
-
我也在考虑 Prior 和 Connect By,但我不确定是否可以用它来解决我的问题。
标签: sql oracle plsql cursor cycle