【发布时间】:2023-03-14 08:30:01
【问题描述】:
我有三张桌子; d_algorithme:
ID_ALGO VERSION_ALGO LIBELLE_ALGO
---------- ------------ --------------------------------------------------
300 A300V1 Algo_300_V1
301 A301V1 Algo_301_V1
302 A302V1 Algo_302_V1
d_algo_ope:
NUM_OPERATION ID_ALGO VERSION_ALGO TYP_OPERATION NUM_ORDRE
------------- ---------- ------------ ------------- ----------
300 301 A301V1 3 1
1 300 A300V1 3 1
301 302 A302V1 3 1
最后是d_algo_maj:
NUM_MISE_A_JOUR ID_ALGO VERSION_ALGO
--------------- ---------- ------------
11 301 A301V1
我想创建一个查询,给出如下结果:
id_algo | version_algo | has_maj
300 | A300V1 | 0
301 | A301V1 | 1
302 | A302V1 | 1
前两列来自d_algorithme,has_maj 是 0 还是 1,这取决于在 d_algo_maj 中是否直接或间接引用了算法。间接引用是通过一个或多个 d_algo_ope 记录,它们一起形成一个层次结构。
对于显示的示例数据:
- 300:
id_algo = 1没有算法或d_algo_ope记录,id_algo = 300没有d_algo_maj记录。 - 301:有一个
d_algo_maj记录与id_algo = 301(足以使has_maj列设置为1)。 - 302:没有
d_algo_maj与id_algo = 302的记录。但是有一个d_algo_ope记录与num_operation = 301和id_algo = 302,这意味着302 算法引用301 算法(它有一个maj),因此has_maj列应该设置为1。
这里是 DDL 和 DML 以及其他细节(从我在现实中得到的简化):
-- DDL -----------------------------
-- d_algorithme
CREATE TABLE D_ALGORITHME
(
ID_ALGO NUMBER(10, 0) NOT NULL
, VERSION_ALGO VARCHAR2(6 BYTE) NOT NULL
, LIBELLE_ALGO VARCHAR2(50 BYTE) NOT NULL
) ;
ALTER TABLE D_ALGORITHME
ADD CONSTRAINT IX_D_ALGORITHME PRIMARY KEY
(
ID_ALGO
, VERSION_ALGO
);
-- d_algo_ope
CREATE TABLE D_ALGO_OPE
(
NUM_OPERATION NUMBER(10, 0) NOT NULL
, ID_ALGO NUMBER(10, 0) NOT NULL
, VERSION_ALGO VARCHAR2(6 BYTE) NOT NULL
, TYP_OPERATION NUMBER(6, 0) NOT NULL
, NUM_ORDRE NUMBER(10, 0) NOT NULL
);
ALTER TABLE D_ALGO_OPE
ADD CONSTRAINT IX_D_ALGO_OPE PRIMARY KEY
(
ID_ALGO
, VERSION_ALGO
, NUM_ORDRE
) ;
-- d_algo_maj
CREATE TABLE D_ALGO_MAJ
(
NUM_MISE_A_JOUR NUMBER(10, 0) NOT NULL
, ID_ALGO NUMBER(10, 0) NOT NULL
, VERSION_ALGO VARCHAR2(6 BYTE) NOT NULL
)
;
ALTER TABLE D_ALGO_MAJ
ADD CONSTRAINT IX_D_ALGO_MAJ PRIMARY KEY
(
ID_ALGO
, VERSION_ALGO
, NUM_MISE_A_JOUR
)
;
-- DML ----------------
REM INSERTING into D_ALGORITHME
Insert into D_ALGORITHME (ID_ALGO,VERSION_ALGO,LIBELLE_ALGO)
values ('300','A300V1','Algo_300_V1');
Insert into D_ALGORITHME (ID_ALGO,VERSION_ALGO,LIBELLE_ALGO)
values ('301','A301V1','Algo_301_V1');
Insert into D_ALGORITHME (ID_ALGO,VERSION_ALGO,LIBELLE_ALGO)
values ('302','A302V1','Algo_302_V1');
REM INSERTING into D_ALGO_OPE
Insert into D_ALGO_OPE
(NUM_OPERATION,ID_ALGO,VERSION_ALGO,TYP_OPERATION,NUM_ORDRE)
values ('300','301','A301V1','3','1');
Insert into D_ALGO_OPE (NUM_OPERATION,ID_ALGO,VERSION_ALGO,TYP_OPERATION,NUM_ORDRE)
values ('1','300','A300V1','3','1');
Insert into D_ALGO_OPE (NUM_OPERATION,ID_ALGO,VERSION_ALGO,TYP_OPERATION,NUM_ORDRE)
values ('301','302','A302V1','3','1');
REM INSERTING into D_ALGO_MAJ
Insert into D_ALGO_MAJ (NUM_MISE_A_JOUR,ID_ALGO,VERSION_ALGO)
values ('11','301','A301V1');
【问题讨论】:
-
通常的连接可能不足以实现这一点,因为有很多级别由第三个表链接,即 d_algo_ope。
-
不确定我是否理解这三个表是如何相关的,或者它们是如何形成层次结构的。 ID/version 1/1 和 2/2 在 d_algo_maj 中都有记录,那为什么第一个是间接的呢? d_algo_ope 是从哪里来的?
-
@AlexPoole 我希望这个链接中的图片能解释更多
-
提前感谢您的帮助
标签: sql oracle hierarchical-query