2012-07-02 3 views
0

Я создаю хранимую процедуру, которая выглядит следующим образом:Проблема с сохраненной процедурой Postgres - как мне ее решить?

CREATE FUNCTION get_components(_given_user_id integer) RETURNS TABLE (id integer, name varchar, active boolean, parent integer, type smallint, description varchar, email varchar, user_id integer, component_id integer, flag smallint) AS $body$ 
BEGIN 
RETURN QUERY SELECT s.* FROM st_components s LEFT JOIN (SELECT a.* FROM st_users_components_perms a WHERE a.user_id=_given_user_id) ON a.component_id=s.id ORDER BY name; 
END; 
$body$ LANGUAGE plpgsql; 

Проблема заключается в том, ON a.component_id = s.id ORDER BY имя не работает, потому что a.component_id выходит за рамки в этой точке , Есть ли способ объявить «a» как st_users_components_perms вне запроса? Как это решить? Большое спасибо за понимание!

+0

Добро пожаловать в SO. Нет смысла в «LEFT JOIN», если вы не собираетесь использовать объединенную таблицу каким-либо образом. Если ваша функция является реальной сделкой, декларация также может быть упрощена. Помимо этого, пожалуйста, отформатируйте с помощью разрывов строк. Трудно это читать. –

ответ

0
SELECT 
    s.* 
FROM 
    st_components s 
LEFT JOIN 
    (SELECT 
     a.* 
    FROM 
     st_users_components_perms a 
    WHERE 
     a.user_id = <CONSTANT> 
    ) AS x 
ON 
    x.component_id = s.id 
ORDER BY 
    name; 

Хотя запрос кажется бессмысленным, но предположим, что это упрощенная версия вашего реального запроса.

+0

Фантастический. Большое вам спасибо, мой добрый человек! – Smeltdown

Смежные вопросы