У меня следующий запрос:
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 это или есть обходной путь (например, можно ли скопировать функцию с нашего производственного сервера или запустить какой-нибудь сценарий для ее «подражания»?) Спасибо!
* Нет, серьезно, на самом деле это стоит больше, чем мой дом.
UPDATE:
Как и предполагалось, я попробовал функцию LISTAGG (которая действительно включена в Express 11g и в SKU «Должны ли мы купить лицензию Oracle или вторую яхту»). Это, кажется, почти работает, но имеет несколько недостатков, которые я могу Найти хороший обходной путь для. Во-первых, запрос:
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 соответствующими значениями из строки, в которой я нахожусь.