创建递归查询 SQLite3 从子级获取父级

时间:2021-04-02 10:12:52

标签: sql sqlite recursion

需要帮助创建递归查询

现有数据:

我们有办公室(Type-1)、部门(Type-2)和员工(Type-3)

enter image description here

需要获取所选员工的办公室名称和该办公室的所有员工姓名

例如:输入 13 (它是员工 ID) 我们得到输出:“Офис в Москве: Винтиков, Шпунтиков, Белова, Крылова, Петрова, ваван”

2 个答案:

答案 0 :(得分:0)

您可以仅使用 join 来实现此目的。要获取办公室的员工人数,您可以使用:

select td.parentid,
       sum(case when te.type = 3 then 1 else 0 end) as num_employees
from t td join
     t te
     on te.parentid = td.id
where t3.type = 3
group by td.parentid;

然后,您还需要一个 join 来获取姓名,并需要一个 having 子句来查看办公室是否有特定员工:

select to.id, to.name,
       sum(case when te.type = 3 then 1 else 0 end) as num_employees
from to join
     t td
     on td.parentid = to.id join
     t te
     on te.parentid = td.id
where t3.type = 3
group by to.id, to.name
having sum(case when t3.name = ? then 1 else 0 end) > 0;

答案 1 :(得分:0)

我在 Python 上解决了这个问题:

SQLite 表:

public

通过员工 ID 递归查找办公室:

CREATE TABLE IF NOT EXISTS "row" (
  "Id"  INTEGER NOT NULL UNIQUE,
  "ParentId"    REFERENCES row,
  "Name"    TEXT NOT NULL,
  "Type"    INTEGER NOT NULL CHECK(Type > 0 AND Type <= 3),
PRIMARY KEY("Id"))

递归地找出结果办公室的所有员工:

index = 13
cursor.execute(
  f"""
    SELECT * FROM row WHERE Id={index}
  """
)

selected_employee = cursor.fetchone()

cursor.execute(
  f"""
    WITH RECURSIVE
      over_employee(Id, ParentId, Name, Type, level)
      AS (
        VALUES({index}, {selected_employee[1]}, "{selected_employee[2]}", {selected_employee[3]}, 0)
        UNION ALL
        SELECT row.Id, row.ParentId, row.Name, row.Type, over_employee.level+1
        FROM row JOIN over_employee ON row.Id=over_employee.ParentId
        )
      SELECT Id, Name, Type, level FROM over_employee;
  """
)

employee_office = cursor.fetchall()[-1]

输出:

<块引用>

Офис в Москве: Винтиков, Шпунтиков, Морозов, Белова, Крылова, Иванова, Петрова,

相关问题