如何连接多个表并打印同一 id 的结果,这些表在一行中填充多个表
How to join multiple tables and printing the result for same id which are populating more than one in a single row
CREATE TABLE details_1 (
e_id NUMBER(10),
e_name VARCHAR2(30),
CONSTRAINT pk_details_1_e_id PRIMARY KEY ( e_id )
);
insert into details_1 values(11,'A');
CREATE TABLE ques_ans (
ques_ans_id NUMBER(10),
ref_ques_id NUMBER(10),
ref_ans_id NUMBER(10),
e_id NUMBER(10),
CONSTRAINT pk_ques_ans PRIMARY KEY ( ques_ans_id ),
CONSTRAINT fk_ques_ans FOREIGN KEY ( e_id )
REFERENCES details_1 ( e_id ),
constraint fk_ques_and_ques_id foreign key(ref_ques_id)
references ques_ref (ques_id)
);
insert into ques_ans values(1,3,1,11);
insert into ques_ans values(2,2,2,11);
insert into ques_ans values(3,4,1,11);
CREATE TABLE ques_ref (
ques_id NUMBER(10),
code VARCHAR2(50),
code_label VARCHAR2(100),
constraint pk_ques_ref primary key(ques_id)
);
insert into ques_ref values(3,'changes_exist','Any known changes');
insert into ques_ref values(2,'E_Clubbed','E_id clubbed with other');
insert into ques_ref values(4,'E_impacted','E impacted by other');
CREATE TABLE ans_ref (
ref_ans_id NUMBER(10),
code VARCHAR2(10),
code_value VARCHAR2(30)
);
insert into ans_ref values(1,'R_Yes','Yes');
insert into ans_ref values(2,'R_No','No');
加入tables面临的问题:
Table ques_ans 有 ref_ques_id 列正在从 ques_ref table 中填充。
所以,如果 ref_ques_id = 3 和 ref_ans_id = 1 那么它应该显示 'Yes' 即从 ans_ref table 填充。同样对于 ref_ques_id = 2 那么它应该显示 'No' 并且对于 ref_ques_id = 4.
我的尝试:
select d.e_id, qa.ref_ques_id,
ar.code_value
from details_1 d
join ques_ans qa on(d.e_id = qa.e_id)
join ans_ref ar on(ar.ref_ans_id = qa.ref_ans_id) ;
在我的尝试中,我得到了 3 行,但理想情况下预期的输出应该像屏幕截图中所附的那样。
列 e_id :来自 details_1 table
列 Changes_exist:在 ques_ans table ref_ques_id 列中验证并基于 ref_ans_id 打印是或否。
列 E_clubbed:在 ques_ans table ref_ques_id 列中验证并基于 ref_ans_id 打印是或否。
列 E_Impacted:在 ques_ans table ref_ques_id 列中验证并基于 ref_ans_id 打印是或否。
输出应该像随附的屏幕截图一样,但我不知道如何将其打印在一行中
工具:SQL开发者
版本:20.4
您编写的代码几乎可以做到;缺少另一个连接(使用 ques_ref
),因此您可以提取代号,但这仍然不能“修复”它,因为 - 据我所知 - 没有办法在内部“动态”执行此操作SQL。我们通常所做的是透视数据。一种选择是使用聚合函数(本例中的 max
)和 case
表达式,并按字面意思 name 每列(使用代码名称你已经以前提取,但只是为了在编写列的别名时提供一些帮助)。
SQL> with temp as
2 (select d.e_id, qa.ref_ques_id, qr.code, ar.code_value
3 from details_1 d
4 join ques_ans qa on d.e_id = qa.e_id
5 join ans_ref ar on ar.ref_ans_id = qa.ref_ans_id
6 join ques_ref qr on qr.ques_id = qa.ref_ques_id
7 )
8 select e_id,
9 max(case when ref_ques_id = 3 then code_value end) changes_exist,
10 max(case when ref_ques_id = 2 then code_value end) e_clubbed,
11 max(case when ref_ques_id = 4 then code_value end) e_impacted
12 from temp
13 group by e_id;
E_ID CHANGES_EXIST E_CLUBBED E_IMPACTED
---------- --------------- --------------- ---------------
11 Yes No Yes
SQL>
CREATE TABLE details_1 (
e_id NUMBER(10),
e_name VARCHAR2(30),
CONSTRAINT pk_details_1_e_id PRIMARY KEY ( e_id )
);
insert into details_1 values(11,'A');
CREATE TABLE ques_ans (
ques_ans_id NUMBER(10),
ref_ques_id NUMBER(10),
ref_ans_id NUMBER(10),
e_id NUMBER(10),
CONSTRAINT pk_ques_ans PRIMARY KEY ( ques_ans_id ),
CONSTRAINT fk_ques_ans FOREIGN KEY ( e_id )
REFERENCES details_1 ( e_id ),
constraint fk_ques_and_ques_id foreign key(ref_ques_id)
references ques_ref (ques_id)
);
insert into ques_ans values(1,3,1,11);
insert into ques_ans values(2,2,2,11);
insert into ques_ans values(3,4,1,11);
CREATE TABLE ques_ref (
ques_id NUMBER(10),
code VARCHAR2(50),
code_label VARCHAR2(100),
constraint pk_ques_ref primary key(ques_id)
);
insert into ques_ref values(3,'changes_exist','Any known changes');
insert into ques_ref values(2,'E_Clubbed','E_id clubbed with other');
insert into ques_ref values(4,'E_impacted','E impacted by other');
CREATE TABLE ans_ref (
ref_ans_id NUMBER(10),
code VARCHAR2(10),
code_value VARCHAR2(30)
);
insert into ans_ref values(1,'R_Yes','Yes');
insert into ans_ref values(2,'R_No','No');
加入tables面临的问题:
Table ques_ans 有 ref_ques_id 列正在从 ques_ref table 中填充。 所以,如果 ref_ques_id = 3 和 ref_ans_id = 1 那么它应该显示 'Yes' 即从 ans_ref table 填充。同样对于 ref_ques_id = 2 那么它应该显示 'No' 并且对于 ref_ques_id = 4.
我的尝试:
select d.e_id, qa.ref_ques_id,
ar.code_value
from details_1 d
join ques_ans qa on(d.e_id = qa.e_id)
join ans_ref ar on(ar.ref_ans_id = qa.ref_ans_id) ;
在我的尝试中,我得到了 3 行,但理想情况下预期的输出应该像屏幕截图中所附的那样。
列 e_id :来自 details_1 table
列 Changes_exist:在 ques_ans table ref_ques_id 列中验证并基于 ref_ans_id 打印是或否。
列 E_clubbed:在 ques_ans table ref_ques_id 列中验证并基于 ref_ans_id 打印是或否。
列 E_Impacted:在 ques_ans table ref_ques_id 列中验证并基于 ref_ans_id 打印是或否。
输出应该像随附的屏幕截图一样,但我不知道如何将其打印在一行中
工具:SQL开发者 版本:20.4
您编写的代码几乎可以做到;缺少另一个连接(使用 ques_ref
),因此您可以提取代号,但这仍然不能“修复”它,因为 - 据我所知 - 没有办法在内部“动态”执行此操作SQL。我们通常所做的是透视数据。一种选择是使用聚合函数(本例中的 max
)和 case
表达式,并按字面意思 name 每列(使用代码名称你已经以前提取,但只是为了在编写列的别名时提供一些帮助)。
SQL> with temp as
2 (select d.e_id, qa.ref_ques_id, qr.code, ar.code_value
3 from details_1 d
4 join ques_ans qa on d.e_id = qa.e_id
5 join ans_ref ar on ar.ref_ans_id = qa.ref_ans_id
6 join ques_ref qr on qr.ques_id = qa.ref_ques_id
7 )
8 select e_id,
9 max(case when ref_ques_id = 3 then code_value end) changes_exist,
10 max(case when ref_ques_id = 2 then code_value end) e_clubbed,
11 max(case when ref_ques_id = 4 then code_value end) e_impacted
12 from temp
13 group by e_id;
E_ID CHANGES_EXIST E_CLUBBED E_IMPACTED
---------- --------------- --------------- ---------------
11 Yes No Yes
SQL>