2015-09-04 29 views
0

以下是我的函數get_reportees對自引用表emp_tabref1的emp_tabref1選擇[COLUMN_NAME] AS,自參照表

CREATE OR REPLACE FUNCTION get_reportees4(IN id integer) 
RETURNS TABLE(e_id integer, e_name character varying, e_manager integer, e_man_name character varying) AS 
$$ 
BEGIN 
RETURN QUERY 
WITH RECURSIVE manger_hierarchy(e_id, e_name, m_id, m_name) AS 
(
SELECT e.emp_id, e.emp_name, e.mgr_id, e.emp_name AS man_name 
FROM emp_tabref1 e WHERE e.emp_id = id 
UNION 
SELECT rp.emp_id, rp.emp_name, rp.mgr_id, rp.emp_name AS man_name 
FROM manger_hierarchy mh INNER JOIN emp_tabref1 rp ON mh.e_id = rp.mgr_id 
) 
SELECT * from manger_hierarchy; 
END; 
$$ LANGUAGE plpgsql VOLATILE 

表結構進行:

CREATE TABLE **emp_tabref1** 
(
emp_id integer NOT NULL, 
emp_name character varying(50) NOT NULL, 
mgr_id integer, 
CONSTRAINT emp_tabref_pkey PRIMARY KEY (emp_id), 
CONSTRAINT emp_tabref_mgr_id_fkey FOREIGN KEY (mgr_id) 
    REFERENCES emp_tabref (emp_id) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION 
) 

我希望返回的是我們傳遞的id的層次結構(包括上面和下面),它們將具有emp_name,emp_id,mgr_id和mgr_name

但我的函數返回這樣的:

select * from get_reportees4(9) 

    e_id e_name e_manager e_man_name 
1 9 "Emp9" 10  "Emp9" 
2 5 "Emp5" 9   "Emp5" 
3 6 "Emp6" 9   "Emp6" 

在我的預期輸出是

 e_id e_name e_manager e_man_name 
1 9 "Emp9"  10  "Emp10" 
2 5 "Emp5"   9  "Emp9" 
3 6 "Emp6"   9  "Emp9" 

函數應該返回經理的名字,而不是員工姓名。請幫忙!

回答

0

找到了解決方案!通過創建一個新的臨時manger_hierarchy表和使用emp_tabref1表mgr_id之間的連接和emp_id爲

CREATE OR REPLACE FUNCTION get_reportees4(IN id integer) 
RETURNS TABLE(e_id integer, e_name character varying, e_manager integer, e_man_name character varying) AS 
$$ 
BEGIN 
RETURN QUERY 
WITH RECURSIVE manger_hierarchy(e_id, e_name, m_id, m_name) AS 
(
SELECT e.emp_id, e.emp_name, e.mgr_id, e.emp_name AS man_name 
FROM emp_tabref1 e WHERE e.emp_id = id 
UNION 
SELECT rp.emp_id, rp.emp_name, rp.mgr_id, rp.emp_name AS man_name 
FROM manger_hierarchy mh INNER JOIN emp_tabref1 rp ON mh.e_id = rp.mgr_id 
) 
SELECT manger_hierarchy.e_id, manger_hierarchy.e_name, manger_hierarchy.m_id, emp_tabref1.emp_name 
FROM manger_hierarchy LEFT JOIN emp_tabref1 ON manger_hierarchy.m_id = emp_tabref1.emp_id; 
END; 
$$ LANGUAGE plpgsql VOLATILE 

SELECT manger_hierarchy.e_id,manger_hierarchy.e_name,manger_hierarchy.m_id,emp_tabref1.emp_name FROM manger_hierarchy LEFT JOIN emp_tabref1 ON manger_hierarchy .m_id = emp_tabref1.emp_id;