递归SQL查询以查找匹配项

乔·d

我有5个SQL表,其以下各列:

tbl_department:

department_id, parent_id


tbl_employee

employee_id, department_id


tbl_department_manager

department_id, employee_manager_id


tbl_request_regular_employee

request_id, employee_id


tbl_request_special_employee

request_id, employee_id

作为输入数据,我有employee_idrequest_id

我需要弄清楚员工是否有权访问该请求(无论他是否是经理)

我们不能在这里使用ORM,因为应用程序的响应能力是我们的优先考虑,并且脚本可能被称为很多。

这是我要实现的逻辑:

  1. 首先,我们tbl_department_manager根据查询到employee_id以检查当前员工是否是经理(该员工也可以是几个部门的经理)。如果是这样,我们得到一个列表department_id(如果没有找到,则返回false)
  2. 如果我们至少有一个ID,tbl_department_manager我们将根据两个表中的和从中查询tbl_request_regular_employeeAND (它们是相同的)tbl_request_special_employeerequest_idemployee_id
  3. 根据employee_id以上收集的信息,我们进行查询以tbl_employee获取department_id该员工所属的唯一列表
  4. 最后列出department_idp.3中的唯一列表,我们可以将其与p.1中的列表进行比较。
  5. 但是要注意的是,在某些tbl_department部门,可能会继承我们从p.1获得的部门(所以我们可能需要递归地找到它,parent_id直到找到至少一个与p中一个元素匹配的项目为止) .1)。如果p.1中的一个元素和p.3中的一个元素之间至少存在一个匹配项,则返回true。因此,需要递归查找。

有人可以提供一个提示如何在MSSQL中实现它吗?任何帮助将不胜感激。

查理菲斯
declare @employee_id int, @request_id int;

with reqEmployees as (
    select regular_employee_id as employee_id
    from tbl_request_regular_employee
    where request_id = @request_id
  union all      --concatenate the two tables
    select special_employee_id
    from tbl_request_special_employee
    where request_id = @request_id
),
cte as (
    select e.department_id, null as parent_id
    from reqEmployees r
    join tbl_employee e  on e.employee_id = r.employee_id -- get these employees' departments
    union all
    select d.department_id, d.parent_id
    from cte              -- recurse the cte
    join tbl_department d on d.department_id = cte.parent_id   -- and get parent departments
)
-- we only want to know if there is any manager row, so exists is enough
select case when exists (select 1
    from cte   --join on managers
    join tbl_department_manager dm on dm.department_id = cte.department_id
    where dm.employee_manager_id = @employee_id)
  then 1 else 0 end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在SQL语句中查找不匹配项

来自分类Dev

在SQL中查找最匹配的项

来自分类Dev

SQL查询以查找错误匹配数据

来自分类Dev

查找匹配子集的 SQL 查询

来自分类Dev

查询以查找列表中的所有匹配项

来自分类Dev

Linq查询以在嵌套列表中查找匹配项

来自分类Dev

MySQL查询以查找2个表之间的匹配项

来自分类Dev

Vlookup查找匹配项

来自分类Dev

从json递归查找依赖项

来自分类Dev

递归查找/替换文件,但仅触摸具有匹配项的文件

来自分类Dev

递归查找目录,但不显示匹配项的子目录

来自分类Dev

使用SQL查询按大小和名称查找重复项

来自分类Dev

如何制定SQL查询以识别表中的匹配项集

来自分类Dev

SQL查询,用于基于多行查找匹配结果

来自分类Dev

查找最具体的匹配项

来自分类Dev

显示查找匹配项的数量

来自分类Dev

SQL Server:递归查询

来自分类Dev

递归SQL查询调用

来自分类Dev

SQL,递归查询

来自分类Dev

递归SQL关系查询

来自分类Dev

SQL递归查询错误

来自分类Dev

递归的Postgre / SQL查询

来自分类Dev

SQL 递归查询 Postgres

来自分类Dev

SQL(Oracle)-查询以查找所有重复项,仅保留最近创建的重复项

来自分类Dev

消除递归SQL重复项

来自分类Dev

为什么在递归SQL“范围”查询中没有重复项?

来自分类Dev

查找目录,如果匹配则不递归

来自分类Dev

SQL查询以查找匹配的记录,但不包括与第二个条件匹配的记录

来自分类Dev

SQL查找匹配的OR