我在表T1上有一个模板
T1
ID | Name
---|----------
1 | template1
然后,当有人在表T2上使用模板时,我需要填写一些参数
T2
ID | Template_ID | Params
---|-------------|---------
1 | 1 | @param1
2 | 1 | @param2
3 | 1 | @param3
4 | 1 | @param4
表T3用特定值链接模板和参数(如果用户未设置参数,则表中将填充默认名称,以便用户稍后进行设置)
T3
ID | Param_ID | Value
---|----------|---------
1 | 1 | xyz
2 | 2 | @param2
3 | 3 | 1
4 | 4 | @param4
因此,我需要在至少1行中列出至少具有1个参数且没有特定值的模板,但是要使用以下查询:
select T1.Name, T3.Value
from T1 inner join T2
on T1.ID = T2.Template_ID
inner join T3
on T2.ID = T3.Param_ID
where T3.Value like '@%';
结果我得到了2行。问题是,我有一个基于oracle DB的系统,我无法执行自己的查询或更改DB参数,只能选择表的列(或仅对列使用max,min,sum和count这4个函数),然后系统自行完成所有查询,因此,我不能在“ where”或“ order by”子句上使用大把戏(例如,将NLS_SORT强制为Binary,或者使用ROWNUM = 1)。因此,我唯一的想法是使用另一个字符而不是@来标识默认参数,以便在T3.Value上使用MAX或MIN函数,但是,肯定地,该字符必须是WEST_EUROPEAN排序中的第一个或最后一个而且我在任何地方都找不到这的排序顺序。谁能帮我吗?
答案 0 :(得分:0)
允许使用的功能列表包括LISTAGG
吗?如果是这样,它将在1行中返回结果。这是一个示例:
SQL> with
2 t1 (id, name) as
3 (select 1, 'template1' from dual),
4 t2 (id, template_id, params) as
5 (select 1, 1, '@param1' from dual union all
6 select 2, 1, '@param2' from dual union all
7 select 3, 1, '@param3' from dual union all
8 select 4, 1, '@param4' from dual
9 ),
10 t3 (id, param_id, value) as
11 (select 1, 1, 'xyz' from dual union all
12 select 2, 2, '@param2' from dual union all
13 select 3, 3, '1' from dual union all
14 select 4, 4, '@param4' from dual
15 )
16 select t1.name, listagg(t3.value, ',') within group (order by t3.value) params
17 from t1 join t2 on t1.id = t2.template_id
18 join t3 on t3.param_id = t2.id
19 where t3.value like '@%'
20 group by t1.name;
NAME PARAMS
--------- --------------------
template1 @param2,@param4
SQL>