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_no
和 group_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
我正在尝试创建一个 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_no
和 group_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 |