【发布时间】:2011-11-01 21:46:44
【问题描述】:
我正在为这个 Oracle 错误而摸不着头脑。以下查询完美运行:
SELECT
V.PROJECTID,
(SELECT WM_CONCAT(DISTINCT NAME)
FROM TPM_TRAININGPLAN JOIN TPM_DELIVERYMETHODS USING (METHODID)
WHERE PROJECTID=V.PROJECTID
AND VERSIONID=V.VERSIONID) as Methods
FROM TPM_PROJECTVERSION V
但是,我想按字母顺序返回我的合并列表,因为我很挑剔。你会认为我会这样做:
SELECT
V.PROJECTID,
(SELECT WM_CONCAT(DISTINCT NAME)
FROM TPM_TRAININGPLAN JOIN TPM_DELIVERYMETHODS USING (METHODID)
WHERE PROJECTID=V.PROJECTID
AND VERSIONID=V.VERSIONID ORDER BY NAME) as Methods
FROM TPM_PROJECTVERSION V
但是,当我尝试这个时,我得到了错误:
[Error] Script lines: 15-19 ------------------------
ORA-00907: missing right parenthesis
我可以在自己的 SELECT 语句中运行查询,如下所示:
SELECT WM_CONCAT(DISTINCT NAME)
FROM TPM_TRAININGPLAN JOIN TPM_DELIVERYMETHODS USING (METHODID)
WHERE PROJECTID=240
AND VERSIONID=1
ORDER BY NAME
它运行良好。我的括号比太阳马戏团的队伍更平衡。为什么会出错?
【问题讨论】:
-
我认为这行不通。聚合不受 ORDER BY 的影响。请对其进行测试,如果需要,我将发布一个用户定义的聚合函数,它会自行排序。不幸的是,我没有支持 WM_CONCAT 的版本。
-
等你说对了。整点是没有意义的,如果我将独立示例更改为
ORDER BY NAME DESC,那么我会得到相同的结果。我只是假设它有效,因为这些值恰好按字母顺序排列。无论如何,我大概可以用一个简单的 LINQ 表达式对它们进行排序。 -
this page 上的 LISTAGG 示例似乎按字母顺序排序,但我并不十分熟悉该语法,因此不确定这是否也适用于 WM_CONCAT。如果没有,您可以随时使用 LISTAGG,如果这不起作用,我将在今天晚些时候发布解决方法。
标签: sql oracle oracle11g ora-00907