I have 5 SQL Tables with the following columns:
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
As input data I have employee_id
and request_id
.
I need to figure out whether the employee has access to the request (whether he’s a manager or not)
We cannot use ORM here since app’s responsiveness is our priority and the script might be called a lot.
Here’s the logic I want to implement:
- First we query to
tbl_department_manager
based onemployee_id
to check whether the current employee is a manager or not (also the employee can be a manager in a few departments). If so, we get a list ofdepartment_id
(if nothing is found, just return false) - If we got at least one id in
tbl_department_manager
we query totbl_request_regular_employee
ANDtbl_request_special_employee
based onrequest_id
and getemployee_id
from both tables (they are the same) - Based on
employee_id
collected above we query totbl_employee
to get a unique list ofdepartment_id
that the employee belongs to. - Finally have a list of unique
department_id
from p.3 which we can compare to the one (ones) that we got in p.1. - The catch is, however, that in
tbl_department
there might be departments which inherit from the one (ones) that we got from p.1 (so we might need to find it recursively based onparent_id
until we find at least one match with one element from p.1). If there’s at least one match between one element in p.1 and one element in p.3 return true. So there’s a need to look for it recursively.
Could someone give a clue how to implement it in MSSQL? Any help would be greatly appreciated.
Advertisement
Answer
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;