如何选择公司及其子公司的所有员工?
使用 SQL Server 2008
员工
Id | Name | CompanyId
公司
Id | Name | ParentCompanyId
例子:
1 微软 0
2 微软印度 1
3 微软西班牙 1
我有以下查询,它只提供来自微软的员工,而不是来自微软印度和西班牙的员工。
SELECT Id, Name FROM Employee WHERE CompanyId=1
我不擅长 SQL。帮我解决这个问题。
如何选择公司及其子公司的所有员工?
使用 SQL Server 2008
员工
Id | Name | CompanyId
公司
Id | Name | ParentCompanyId
例子:
1 微软 0
2 微软印度 1
3 微软西班牙 1
我有以下查询,它只提供来自微软的员工,而不是来自微软印度和西班牙的员工。
SELECT Id, Name FROM Employee WHERE CompanyId=1
我不擅长 SQL。帮我解决这个问题。
使用 CTE 构建公司层次结构,然后将其连接回员工表:
with CompanyHierarchy as
(
select Id
from Company
where Id = 1
union all
select c.Id
from Company c
inner join CompanyHierarchy ch on c.ParentCompanyId = ch.Id
)
select e.*
from CompanyHierarchy ch
inner join Employees e on ch.Id = e.CompanyId
CompanyId如果要参数化语句,还可以将变量替换为CTE 的锚部分:
with CompanyHierarchy as
(
select Id
from Company
where Id = @CompanyId
union all
select c.Id
from Company c
inner join CompanyHierarchy ch on c.ParentCompanyId = ch.Id
)
select e.*
from CompanyHierarchy ch
inner join Employees e on ch.Id = e.CompanyId
SQL Fiddle with demo,现在增加了层次结构。
SELECT
employee.name,
company.id
FROM employee
INNER JOIN company
On employee.companyId= company.id
WHERE company.id IN (1,2,3)
这对于查询是正确的,因为您只询问公司 ID 为 1 的记录。
您必须编写类似这样的查询。
SELECT Id, Name FROM Employee WHERE CompanyId in (SELECT Id FROM Company)
现在我已经尝试了上述方法,它可以完成您给定的查询所需的操作。但是对于基于 Comapny/ParentCompany 的期望结果,请尝试以下查询。
SELECT e.Id, e.Names FROM Employee e WHERE e.CompanyId = 1
or e.CompanyId in (SELECT c.Id FROM Company c where c.ParentCompanyId = 1)
希望这可以帮助。