自我指涉课:如何在公司中获得员工的分层结构?

时间:2013-12-26 09:58:54

标签: python sql postgresql sqlalchemy postgresql-9.1

我在Python中定义了一个名为Employees的类。其属性id_supervisor是负责他的员工的id

一名员工可以负责(监督)许多其他员工。

这是我的班级:

class Employee(DeclarativeBase):

    __tablename__ = 'employees'

    id_ = Column('id',Integer,primary_key=True)
    name = Column(Unicode(50))
    id_supervisor = Column(Integer, ForeignKey('employees.id'))
    #other attributes ...

我需要做的是从公司老板那里获得公司的整个层次结构(他将id_supervisor属性设置为None或自己)到最低层公司的工作人员(他根本不会监督工人)。

怎么可以这样做?我一直在考虑使用递归函数,但我真的不知道该怎么做。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

请尝试使用材料https://class.coursera.org/db/wiki/coursematerials。您可以看到有关递归的部分(SQL中的递归)。 PostgreSQL示例很好地解释了它。

postgres=# select * from employees ;
 empid | supervisorid 
-------+--------------
     1 |             
     2 |             
     3 |            1
     4 |            2
     5 |            3
     6 |            4
(6 rows)

WITH RECURSIVE emp(empid,supervisorid) AS (
     SELECT empid, supervisorid  FROM employees where empid=1
     UNION ALL
     SELECT e.empid, e.supervisorid
     FROM emp s, employees e
     WHERE e.supervisorid = s.empid 
   )
SELECT * 
 FROM emp
 ;
 empid | supervisorid 
-------+--------------
     1 |             
     3 |            1
     5 |            3
(3 rows)