2011-11-01 47 views
2

我有以下查询:Oracle的哪些SKU支持WM_CONCAT?

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实例(11克),我使用的发展,我得到的错误:

>[Error] Script lines: 13-16 ------------------------ 
ORA-00904: "WM_CONCAT": invalid identifier 
Script line 13, statement line 1, column 7 

Oracle是否快递不支持这一点,还是有一个变通(如因为我可以从我们的生产服务器复制功能,或运行一些脚本来“模仿”它?)谢谢!

*没有认真,它实际上比我的房子花费更多。

UPDATE:

至于建议,我试过LISTAGG功能(这的确是包含在这两个快递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 

但是,我想删除这些蠢事。更改NAMEDISTINCT 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

什么是* Oracle SKU *? –

+0

http://en.wikipedia.org/wiki/Stock-keeping_unit –

+0

@MikeChristensen我不是这样说的:“所以现在我不能用我所在的行取代240和1。”您是否需要将projectId和/或versionId上的聚合分组? – Harrison

回答

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快捷11gR2的测试这个(只是企业)。 但Oracle Express没有Java支持,但您可以尝试通过自定义类型来实现它(我再次没有Express来测试!) http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:2196162600402

+0

看起来几乎完美!我试了一下,并在上面添加了我的评论。我认为我们正处于正确的轨道上。 –