- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我正在尝试做的事情和我得到的结果的一个最小的工作示例:
我有一个查询如下:
/*
with tran_party as -- ALL DUMMY DATA ARE IN THESE CTE FOR YOUR REFERENCE
(select 1 tran_party_id, 11 transaction_id, 101 team_id_redirect
from dual
union all
select 2, 11, 101 from dual
union all
select 3, 11, 102 from dual
union all
select 4, 12, 103 from dual
union all
select 5, 12, 103 from dual
union all
select 6, 12, 104 from dual
union all
select 7, 13, 104 from dual
union all
select 8, 13, 105 from dual),
tran as
(select 11 transaction_id, 1001 account_id, 1034.93 amount from dual
union all
select 12, 1001, 2321.89 from dual
union all
select 13, 1002, 3201.47 from dual),
account as
(select 1001 account_id, 111 team_id from dual
union all
select 1002, 112 from dual),
team as
(select 101 team_id, 'UUU' as team_code from dual
union all
select 102, 'VV' from dual
union all
select 103, 'WWW' from dual
union all
select 104, 'XXXXX' from dual
union all
select 105, 'Z' from dual)
-- */
-- The Actual Query
select a.account_id,
t.transaction_id,
(select listagg (tm_redir.team_code, ', ')
within group (order by tm_redir.team_code)
from tran_party tp_redir
inner join team tm_redir
on tp_redir.team_id_redirect = tm_redir.team_id
inner join tran t_redir
on tp_redir.transaction_id = t_redir.transaction_id
where t_redir.account_id = a.account_id
and t_redir.transaction_id != t.transaction_id)
as teams_redirected
from tran t inner join account a on t.account_id = a.account_id;
NOTE: tran_party.team_id_redirect is a foreign key that references team.team_id.
当前输出:
ACCOUNT_ID TRANSACTION_ID TEAMS_REDIRECTED
---------- -------------- ----------------
1001 11 WWW, WWW, XXXXX
1001 12 UUU, UUU, VV
1002 13
预期输出:
我希望 TEAMS_REDIRECTED
列中的重复项目仅被选择一次,如下所示:
ACCOUNT_ID TRANSACTION_ID TEAMS_REDIRECTED
---------- -------------- ----------------
1001 11 WWW, XXXXX
1001 12 UUU, VV
1002 13
我尝试过的:
我没有直接从 tran_party
中进行选择,而是编写了一个内联 View ,从 tran_party 中选择不同的值,如下所示:
select a.account_id,
t.transaction_id,
(select listagg (tm_redir.team_code, ', ')
within group (order by tm_redir.team_code)
from (select distinct transaction_id, team_id_redirect -- Note this inline view
from tran_party) tp_redir
inner join team tm_redir
on tp_redir.team_id_redirect = tm_redir.team_id
inner join tran t_redir
on tp_redir.transaction_id = t_redir.transaction_id
where t_redir.account_id = a.account_id
and t_redir.transaction_id != t.transaction_id)
as teams_redirected
from tran t inner join account a on t.account_id = a.account_id;
虽然这确实给了我预期的输出,但当我在实际代码中使用此解决方案时,仅检索一行需要大约 13 秒。因此我无法使用我已经尝试过的东西。
任何帮助将不胜感激。
最佳答案
以下方法摆脱了内联 View 来获取重复项,它使用 LISTAGG
函数上的 REGEXP_REPLACE
和 RTRIM
来获取聚合列表中的不同结果集。因此,它不会执行多次扫描。
将此部分添加到您的代码中,
RTRIM(REGEXP_REPLACE(listagg (tm_redir.team_code, ',')
WITHIN GROUP (ORDER BY tm_redir.team_code),
'([^,]+)(,\1)+', '\1'),
',')
修改查询-
SQL> with tran_party as -- ALL DUMMY DATA ARE IN THESE CTE FOR YOUR REFERENCE
2 (select 1 tran_party_id, 11 transaction_id, 101 team_id_redirect
3 from dual
4 union all
5 select 2, 11, 101 from dual
6 union all
7 select 3, 11, 102 from dual
8 union all
9 select 4, 12, 103 from dual
10 union all
11 select 5, 12, 103 from dual
12 union all
13 select 6, 12, 104 from dual
14 union all
15 select 7, 13, 104 from dual
16 union all
17 select 8, 13, 105 from dual),
18 tran as
19 (select 11 transaction_id, 1001 account_id, 1034.93 amount from dual
20 union all
21 select 12, 1001, 2321.89 from dual
22 union all
23 select 13, 1002, 3201.47 from dual),
24 account as
25 (select 1001 account_id, 111 team_id from dual
26 union all
27 select 1002, 112 from dual),
28 team as
29 (select 101 team_id, 'UUU' as team_code from dual
30 union all
31 select 102, 'VV' from dual
32 union all
33 select 103, 'WWW' from dual
34 union all
35 select 104, 'XXXXX' from dual
36 union all
37 select 105, 'Z' from dual)
38 -- The Actual Query
39 select a.account_id,
40 t.transaction_id,
41 (SELECT RTRIM(
42 REGEXP_REPLACE(listagg (tm_redir.team_code, ',')
43 WITHIN GROUP (ORDER BY tm_redir.team_code),
44 '([^,]+)(,\1)+', '\1'),
45 ',')
46 from tran_party tp_redir
47 inner join team tm_redir
48 on tp_redir.team_id_redirect = tm_redir.team_id
49 inner join tran t_redir
50 on tp_redir.transaction_id = t_redir.transaction_id
51 where t_redir.account_id = a.account_id
52 and t_redir.transaction_id != t.transaction_id)
53 AS teams_redirected
54 from tran t inner join account a on t.account_id = a.account_id
55 /
ACCOUNT_ID TRANSACTION_ID TEAMS_REDIRECTED
---------- -------------- --------------------
1001 11 WWW,XXXXX
1001 12 UUU,VV
1002 13
SQL>
关于sql - SELECT 列表中子查询内的不同 LISTAGG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27817195/
这是我第一次使用 LISTAGG 函数,我很困惑。我可以很容易地选择数据,但是 USERS 列的字符之间都有空格,并且在尝试复制粘贴时,没有复制该列中的数据。我试过两种不同的 IDE。我做错了什么吗?
SELECT e.pem_id AS id, e.pem_subject AS subject, e.pem_content AS content
我正在我的脚本中使用 listagg listagg(' |' || aktiv.AKTIVITÄT_NR || ' |' || aktiv.AKTIVITÄT_KÜRZEL || ' |' ||
我正在尝试使用 LISTAGG() 来获取超过两列。 SELECT deptname, deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename
哪个更有效,特别是在将 Listagg 与 varchar 类型数据一起使用的情况下? SELECT department_id AS "Dept.", LISTAGG(last_nam
我正在尝试在 Redshift 中检索表的 DDL。我找到了 this View ,我可以在其中轻松选择任何表的定义。但是,我需要在一行中提供此信息,并且我知道有这个 Listagg 函数,但是如果我
我有一张这样的 table (报告) -------------------------------------------------- | user_id | Department | Pos
这是我正在尝试做的事情和我得到的结果的一个最小的工作示例: 我有一个查询如下: /* with tran_party as -- ALL DUMMY DATA ARE IN THESE CTE FOR
我正在研究 Oracle SQL-Developer。 让我们从数据开始,以更好地描述我的问题。我有一个有 2 列的表格 USER JOB 这 2 者之间的关系是 1,n。因此,1 个用户可以与 1
我正在尝试聚合一列: SELECT LISTAGG(name, '; ') WITHIN GROUP (ORDER BY name) FROM tbl_a INNER JOIN tbl_b ON t
我在 oracle 中有一个这样的查询,但我想要一个与此等效的配置单元 SQL。有人可以指导我下面的等效配置单元是什么 '[' || LISTAGG(t3.measure_title, ';') 在组
在 GORM(使用 grails)中,我需要将子选择中的多个结果合并为一个值。 (此子选择的结果将是连接值,我可以在其上进行搜索/排序等......) 查询写为 HQL。 oracle中有这样的东西
美好的一天。我正在编写一个使用 LISTAGG 并返回结果的查询。这是我到目前为止的代码。 select listagg(rtrim(shop_cde, 1), ', ') within
我正在研究 Oracle SQL-Developer。 让我们从数据开始,以更好地描述我的问题。我有一个有 2 列的表格 USER JOB 这 2 者之间的关系是 1,n。因此,1 个用户可以与 1
我正在尝试聚合一列: SELECT LISTAGG(name, '; ') WITHIN GROUP (ORDER BY name) FROM tbl_a INNER JOIN tbl_b ON t
我在 oracle 中有一个这样的查询,但我想要一个与此等效的配置单元 SQL。有人可以指导我下面的等效配置单元是什么 '[' || LISTAGG(t3.measure_title, ';') 在组
所有结果的 good_name 列均为空。查询中存在什么问题? select fp.id, listagg(fpg.name, ',') within group(order by fpg.na
这个问题已经有答案了: LISTAGG function: "result of string concatenation is too long" (14 个回答) 已关闭 9 年前。 我正在使用
我正在尝试聚合 SQLServer 中的“STRING”字段。我想找到与 Oracle 中相同的函数 LISTAGG 。 您知道如何执行相同的功能或其他方法吗? 例如, Field A | Field
假设我有以下两个表表 1 - 用户 ID UserName 001 abc 002 bcd 003 def 表 2 - 值 ID Tag Price 001 start 1 001 middle 2
我是一名优秀的程序员,十分优秀!