2012-07-02 45 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