我有以下查询:
SELECT wm_concat(DISTINCT NAME) as Methods FROM TPM_TRAININGPLAN
JOIN TPM_DELIVERYMETHODS USING (METHODID)
WHERE PROJECTID=735 AND VERSIONID=1
ORDER BY NAME
在我们的生产数据库(一些价格超过我家*的超级昂贵的Oracle SKU)上,它返回:
I/OLT,ILT-WEB,OLT,QRG
但是,在我用于开发的本地Oracle Express实例(11g)上,我收到错误:
>[Error] Script lines: 13-16 ------------------------
ORA-00904: "WM_CONCAT": invalid identifier
Script line 13, statement line 1, column 7
Oracle Express是否不支持此功能,或者是否有解决方法(例如我可以从我们的生产服务器复制该功能,还是运行一些脚本来“模仿”它?)谢谢!
* 没有认真的,它实际上比我的房子花费更多。
更新
正如所建议的那样,我尝试了LISTAGG功能(确实包含在Express 11g和“我们应该购买Oracle许可证还是第二艘游艇”SKU中。这看起来几乎可行,但有一些缺点我可以找不到合适的解决方法。首先,查询:
SELECT LISTAGG(NAME, ',') WITHIN GROUP (ORDER BY NAME) Methods FROM
TPM_TRAININGPLAN
JOIN TPM_DELIVERYMETHODS USING (METHODID) WHERE PROJECTID=240 AND VERSIONID=1
将返回:
COMM,COMM,ILT-F2F,ILT-F2F,ILT-F2F,ILT-F2F,ILT-F2F
但是,我想删除欺骗。将NAME
更改为DISTINCT NAME
会引发错误DISTINCT option not allowed for this function
太好了,我们只会在那里扔一个CTE:
WITH Methods AS
(SELECT DISTINCT NAME
FROM TPM_TRAININGPLAN
JOIN TPM_DELIVERYMETHODS USING (METHODID) WHERE PROJECTID=240 AND VERSIONID=1)
SELECT LISTAGG(NAME, ',') WITHIN GROUP (ORDER BY NAME) Methods FROM Methods
这是有效的,但是我忘了提到我在一个更大的查询中作为嵌套选择运行这整个事情。您似乎可以使用包含CTE的嵌套选择,但是在查询中您不能再引用根查询,只能引用CTE。所以现在我不能用我所在的行中的适当值替换240和1。
答案 0 :(得分:2)
如果您在11GR2,您应该能够listagg
with fake_data as(
select 'I/OLT' NAME , 1 aa from dual
union all
select 'ILT-WEB' NAME,2 from dual
union all
select 'OLT' NAME,3 from dual
union all
select 'QRG' NAME,4 from dual
)
SELECT
LISTAGG(NAME, ', ') WITHIN GROUP (ORDER BY name) name_list
FROM fake_data
;
NAME_LIST
--------------------------
I/OLT, ILT-WEB, OLT, QRG
我没有Oracle Express 11Gr2来测试这个(只是企业)。 但Oracle Express没有Java支持,但您可以尝试通过自定义类型实现它(再一次我没有Express来测试!) http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:2196162600402