【问题标题】:Need to concatenate multiple rows into single cell using SQL?需要使用 SQL 将多行连接到单个单元格中吗?
【发布时间】:2011-11-04 16:08:50
【问题描述】:

目前我已经写了:

SELECT IT_ID, SUBSTR (SYS_CONNECT_BY_PATH (grp , ','), 2) GROUPS
FROM (SELECT U.IT_ID, LAST_NAME, FIRST_NAME, GRP, ROW_NUMBER() OVER (ORDER BY U.IT_ID) rn, COUNT(*) OVER() cnt
FROM ECG_IT_USERS U
JOIN SECUREGROUPS G ON U.IT_ID = G.IT_ID)

START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1

这会返回:

IT_ID   GROUPS

afz23   ADMIN
afz23   ADMIN,QA
alv77   ADMIN,QA,USER
jaj23   ADMIN,QA,USER,USER
klo26   ADMIN,QA,USER,USER,PROD
klo26   ADMIN,QA,USER,USER,PROD,ADMIN
klo26   ADMIN,QA,USER,USER,PROD,ADMIN,QA
mav45   ADMIN,QA,USER,USER,PROD,ADMIN,QA,ADMIN

我不知道如何在遇到新用户后将其重置?它似乎继承了以前的组,即使用户不属于他们。

我要看看:

IT_ID   GROUPS

afz23   ADMIN,QA
alv77   USER
jaj23   USER
klo26   PROD,ADMIN,QA
mav45   ADMIN

【问题讨论】:

标签: sql database oracle oracle11g


【解决方案1】:

您需要在这里做三件事。

首先,您需要向 row_number 函数添加一个分区,以便每个 IT_ID 从 1 开始编号。您还需要将 IT_ID 列添加到连接方式,以便它只接收具有相同 IT_ID 值的行。最后,您需要按 it_id 列分组以删除重复的行。

最终的查询是

with ECG_IT_USERS as (
  select 'afz23' as it_id from dual union all
  select 'alv77' as it_id from dual union all
  select 'jaj23' as it_id from dual union all
  select 'klo26' as it_id from dual union all
  select 'mav45' as it_id from dual
),
securegroups as (
  select 'afz23' as it_id, 'ADMIN' as grp from dual union all
  select 'afz23' as it_id, 'QA' as grp from dual union all
  select 'alv77' as it_id, 'USER' as grp from dual union all
  select 'jaj23' as it_id, 'USER' as grp from dual union all
  select 'klo26' as it_id, 'PROD' as grp from dual union all
  select 'klo26' as it_id, 'ADMIN' as grp from dual union all
  select 'klo26' as it_id, 'QA' as grp from dual union all
  select 'mav45' as it_id, 'ADMIN' as grp from dual
)
SELECT 
  IT_ID, 
  Max(SUBSTR (SYS_CONNECT_BY_PATH (grp , ','), 2)) GROUPS
FROM (
  SELECT 
    U.IT_ID, 
--    LAST_NAME, 
--    BFIRST_NAME, 
    GRP, 
    ROW_NUMBER() OVER (partition by u.it_id ORDER BY U.IT_ID) rn, 
    COUNT(*) OVER() cnt
FROM ECG_IT_USERS U
JOIN SECUREGROUPS G ON (U.IT_ID = G.IT_ID))
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1 and it_id = prior it_id
Group by it_id

这会为我产生以下输出:

IT_ID GROUPS
----- --------------------
alv77 USER
afz23 ADMIN,QA
jaj23 USER
mav45 ADMIN
klo26 PROD,ADMIN,QA

编辑:我添加了一个带有一些示例数据的 with 子句,尽管我确实注释掉了 last_name 和 first_name 列,因为它们对最后的查询,我在连接条件周围放了一些括号。

也许从我上面的查询开始是值得的,检查它最初是否适合你并适当地修改它。

【讨论】:

  • 谢谢!我有一个问题,START/CONNECT BY 子句不识别 rn,说 Invalid Identifier?我猜是因为它对外部调用不可见?但是很奇怪
  • @antonpug:我在查询中添加了一些示例数据,看看现在是否适合您。
猜你喜欢
  • 2010-11-12
  • 2021-08-26
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
相关资源
最近更新 更多