oracle listagg return 某些值的所有记录

oracle listagg to return all records for certain values

我正在尝试创建一个 Oracle 查询,returns empno 1 和 2 的所有组和用户。非常感谢任何帮助。

emp table:  
 emp_no   
 ------  
   1    
   2   
        
group table:
 group_id  emp_no  
  --------  ----
    1          1
    1          2
    2          3
    2          4
    3          5
    3          6
            
-------------
  result
-------------
 group 1  empno 1, group 1 empno 2, group 2 empno 3, group 2 empno 4 
        
         

   

看来table组已经够你的作业了。
组 table 因名称而导致错误。我把它放在双撇号中 (Oracle 11g R2)。
您可以在 listagg 子句中使用字符串函数。
即使对于 listagg,您也可以使用 where 子句获取某些值。多行结果将使用 group by 子句,但事实并非如此。

架构:

CREATE TABLE emp (
  emp_no number
);

CREATE TABLE "group" (
  group_id number,
  emp_no number
);

insert into emp (emp_no) values (1);
insert into emp (emp_no) values (2);

insert into "group" (group_id,emp_no) values (1,1);
insert into "group" (group_id,emp_no) values (1,2);
insert into "group" (group_id,emp_no) values (2,3);
insert into "group" (group_id,emp_no) values (2,4);
insert into "group" (group_id,emp_no) values (3,5);
insert into "group" (group_id,emp_no) values (3,6);

Select:

select
listagg ('group ' || "group".group_id || ' empno ' || "group".emp_no, ', ')
  within group (order by "group".group_id, "group".emp_no) "result"
from "group"
where "group".group_id in (1,2);

输出:

result
group 1 empno 1, group 1 empno 2, group 2 empno 3, group 2 empno 4

Select对应你的作业:

select
listagg ('group ' || "group".group_id || ' empno ' || "group".emp_no, ', ')
  within group (order by "group".group_id, "group".emp_no) "result"
from emp left join "group" on emp.emp_no="group".emp_no
where emp.emp_no in (1,2);

您请求的输出不匹配:

result
group 1 empno 1, group 1 empno 2

编辑 1:

正如@MT0 在评论中提到的,对于 group table 中的反向列 emp_nogroup_id,第二个 select:

CREATE TABLE emp (
  emp_no number
);

CREATE TABLE "group" (
  group_id number,
  emp_no number
);

insert into emp (emp_no) values (1);
insert into emp (emp_no) values (2);

insert into "group" (emp_no,group_id) values (1,1);
insert into "group" (emp_no,group_id) values (1,2);
insert into "group" (emp_no,group_id) values (2,3);
insert into "group" (emp_no,group_id) values (2,4);
insert into "group" (emp_no,group_id) values (3,5);
insert into "group" (emp_no,group_id) values (3,6);

输出:

result
group 1 empno 1, group 2 empno 1, group 3 empno 2, group 4 empno 2

!!我弄乱了 selection 以达到正确的输出:

select
listagg ('group ' || "group".emp_no || ' empno ' || "group".group_id, ', ')
  within group (order by "group".group_id, "group".emp_no) "result"
from emp left join "group" on emp.emp_no="group".emp_no
where emp.emp_no in (1,2);

输出:

result
group 1 empno 1, group 1 empno 2, group 2 empno 3, group 2 empno 4