【问题标题】:How to join multiple tables and printing the result for same id which are populating more than one in a single row如何连接多个表并打印在单行中填充多个表的相同 id 的结果
【发布时间】:2022-01-13 11:00:46
【问题描述】:
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');

加入表格面临的问题:

表 ques_ans 具有从 ques_ref 表填充的 ref_ques_id 列。 因此,如果 ref_ques_id = 3 和 ref_ans_id = 1 那么它应该显示“是”,即从 ans_ref 表中填充。同样,对于 ref_ques_id = 2,它应该显示“否”,对于 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 表

Column Changes_exist:在 ques_ans 表 ref_ques_id 列中进行验证,并基于 ref_ans_id 打印 Yes 或 no。

列 E_clubbed:在 ques_ans 表 ref_ques_id 列中进行验证,并基于 ref_ans_id 打印是或否。

列 E_Impacted:在 ques_ans 表 ref_ques_id 列中进行验证,并基于 ref_ans_id 打印是或否。

输出应该像所附的屏幕截图一样,但我被困在如何将其打印在一行中

工具:SQL Developer 版本:20.4

【问题讨论】:

  • 您想将行转换为列 - 这可以使用 PIVOT 子句来完成。

标签: sql oracle plsql


【解决方案1】:

您编写的代码几乎可以做到;缺少另一个连接(带有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>

【讨论】:

  • 感谢您的帮助。为什么我们要使用 max 函数?旋转数据意味着什么?
  • 不客气。使用聚合只创建一行;尝试在没有它的情况下运行该代码(并删除 GROUP BY) - 您将获得 3 行只有 3 个值,而其余为空(NULL)。 “透视”意味着将布局从行“转换”为列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2020-11-03
  • 2012-06-17
  • 2013-08-07
相关资源
最近更新 更多