需要帮助创建递归查询
现有数据:
我们有办公室(Type-1)、部门(Type-2)和员工(Type-3)
需要获取所选员工的办公室名称和该办公室的所有员工姓名
例如:输入 13 (它是员工 ID) 我们得到输出:“Офис в Москве: Винтиков, Шпунтиков, Белова, Крылова, Петрова, ваван”
答案 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]
输出:
<块引用>Офис в Москве: Винтиков, Шпунтиков, Морозов, Белова, Крылова, Иванова, Петрова,