我不确定这个问题之前是否在其他地方被问过。我也不知道该怎么说。但我会用一个场景来解释。
我有以下表格
TAB1 包含列:用户 ID、代码、国家/地区
TAB2 包含列:用户 ID、代码、电子邮件
示例内容:
TAB1:
RISHI, A1B2C3, INDIA
RISHI, D2E3F4, INDIA
KANTA, G3H4I5, INDONESIA
TAB2:
RISHI, A1B2C3, [email protected]
RISHI, A1B2C3, [email protected]
RISHI, A1B2C3, [email protected]
RISHI, D2E3F4, [email protected]
RISHI, D2E3F4, [email protected]
KANTA, G3H4I5, [email protected]
我想要从 select 查询或 pl/sql 存储过程中得到这样的结果:
RISHI, INDIA, A1B2C3, ([email protected], [email protected], [email protected])
RISHI, INDIA, D2E3F4, ([email protected], [email protected])
如果我进行如下选择:
select a.userid, a.code, a.country, b.email
from tab1.a, tab2.b
where a.userid = b.userid
and a.code = b.code
and a.userid = 'RISHI';
我得到的结果是:
RISHI, INDIA, A1B2C3, [email protected]
RISHI, INDIA, A1B2C3, [email protected]
RISHI, INDIA, A1B2C3, [email protected]
RISHI, INDIA, D2E3F4, [email protected]
RISHI, INDIA, D2E3F4, [email protected]
我基本上需要的是将电子邮件 ID 分组到一个数组中。假设 TAB1 包含更多我实际需要的列,但我在本例中省略了,但 TAB2 只有这三列。
select a.userid, a.code, a.country, listagg(b.email, ',') within group (order by b.email) as "Emails"
from tab1.a, tab2.b
where a.userid = b.userid
and a.code = b.code
and a.userid = 'RISHI'
group by a.userid, a.code, a.country;
我想你想在MySQL中使用
GROUP_CONCAT
聚合函数。坏消息是 Oracle 没有用于组串联的内置函数,好消息是您可以模拟这样的功能。
看这个片段:
with data
as
(
select job,
ename,
row_number() over (partition by job order by ename) rn,
count(*) over (partition by job) cnt
from emp
)
select job, ltrim(sys_connect_by_path(ename,','),',') scbp
from data
where rn = cnt
start with rn = 1
connect by prior job = job and prior rn = rn-1
order by job
并且会回来
JOB SCBP
--------- ----------------------------------------
ANALYST FORD,SCOTT
CLERK ADAMS,JAMES,MILLER,SMITH
MANAGER BLAKE,CLARK,JONES
PRESIDENT KING
SALESMAN ALLEN,MARTIN,TURNER,WARD
选择 listagg(n, ', ')
组内(按 n 排序) con
from(从员工中选择部门 ID d, 名字 || ' ' || 姓氏 n
其中部门 ID = 1) ;
爱丽丝·佩里、多丽丝·格雷厄姆、多丽丝·鲍威尔