首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择[COLUMN_NAME] AS,自引用表

选择[COLUMN_NAME] AS,自引用表
EN

Stack Overflow用户
提问于 2015-09-04 09:06:40
回答 1查看 116关注 0票数 0

下面是我在自引用表get_reportees上执行的函数emp_tabref1

代码语言:javascript
复制
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

Emp_tabref1的表结构:

代码语言:javascript
复制
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

但我的功能是这样回来的:

代码语言:javascript
复制
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"

我的预期产出在哪里

代码语言:javascript
复制
       e_id e_name  e_manager e_man_name
1    9  "Emp9"        10        "Emp10"
2    5  "Emp5"         9        "Emp9"
3    6  "Emp6"         9        "Emp9"

函数应该返回经理名,而不是员工名。请帮帮我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-04 09:55:23

找到解决办法了!通过在临时manger_hierarchy表和emp_tabref1表之间使用mgr_id和emp_id创建一个新的连接

代码语言:javascript
复制
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

选择manger_hierarchy.e_id,manger_hierarchy.e_name,manger_hierarchy.m_id,emp_tabref1.emp_name从manger_hierarchy左加入emp_tabref1 ON manger_hierarchy.m_id = emp_tabref1.emp_id;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32394171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档