#sql #postgresql #string-aggregation
#sql #postgresql #агрегация строк
Вопрос:
Я выполняю миграцию с MSSQL на PostgreSQL
Запрос MSSQL:
SELECT * FROM dbo.Mtr_userdetails AS table1 JOIN( SELECT urmo.urm_userid STUFF((SELECT ',' urm.urm_role_name FROM dbo.STL_CS_Mtr_userrolemapping urm WHERE urm.urm_userid = 'test2' AND urm.urm_status = 'A' AND urm.urm_appid = 'BCA' FOR XML PATH('')),1,1,'') [user_roles],urmo.urm_appid FROM dbo.Mtr_userrolemapping urmo WHERE urmo.urm_appid = 'BCA' AND urmo.urm_userid = 'test2' GROUP BY urmo.urm_userid,urmo.urm_appid) AS table2 ON table1.ud_userid = table2.urm_userid WHERE (table1.ud_userid = 'test2')
Я пытаюсь преобразовать приведенный выше запрос ms sql в синтаксис postgresql.
Запрос PostgreSQL:
SELECT *
FROM STL_Mtr_userdetails AS table1
JOIN (
SELECT urmo.urm_userid,
string_agg((SELECT ',' || urm.urm_role_name
FROM STL_CS_Mtr_userrolemapping urm
WHERE urm.urm_userid = 'test2'
AND urm.urm_status = 'A'
AND urm.urm_appid = 'BCA')::varchar, 1::varchar, 1::varchar, ''::varchar) user_roles,
urmo.urm_appid
FROM STL_CS_Mtr_userrolemapping urmo
WHERE urmo.urm_appid = 'BCA'
AND urmo.urm_userid = 'test2'
GROUP BY urmo.urm_userid,
urmo.urm_appid
) AS table2 ON table1.ud_userid = table2.urm_userid
WHERE (table1.ud_userid = 'test2')
При выполнении моего запроса postgresql я сталкиваюсь с приведенной ниже ошибкой
string_agg(изменение символа, изменение символа, изменение символа, изменение символа) не существует. Ни одна подсказка не соответствует заданному имени и типам аргументов. возможно, вам потребуется добавить явное приведение типов.
Комментарии:
1. Я действительно рекомендую использовать пробелы и разрывы строк при написании (я имею в виду не только написание кода, я имею в виду в целом). Этот код слишком широк для «однострочного».
2. Ну, как описано в руководстве string_agg() принимает только два параметра, а не 4
3. Конечно, за этим последует
Ответ №1:
Нет необходимости в сложном вложенном скалярном подвыборе. Просто агрегируйте напрямую:
SELECT *
FROM STL_Mtr_userdetails AS table1
JOIN (
SELECT urmo.urm_userid,
string_agg(urm.urm_role_name, ',') as user_roles
FROM STL_CS_Mtr_userrolemapping urmo
WHERE urmo.urm_appid = 'BCA'
GROUP BY urmo.urm_userid
) AS table2 ON table1.ud_userid = table2.urm_userid
WHERE table1.ud_userid = 'test2'
Сообщение об ошибке связано с тем, что вы пытаетесь вызвать string_agg()
функцию с четырьмя параметрами (varchar). Но string_agg()
определен для получения только двух параметров (значения для агрегирования и разделитель).
Комментарии:
1. Спасибо за ваш ответ. Я выполнил приведенный выше запрос, и в нем указано, что отсутствует запись в предложении для таблицы ‘urm’