5

如何选择公司及其子公司的所有员工?

使用 SQL Server 2008

员工

Id | Name | CompanyId  

公司

Id | Name | ParentCompanyId  

例子:

1 微软 0

2 微软印度 1

3 微软西班牙 1

我有以下查询,它只提供来自微软的员工,而不是来自微软印度和西班牙的员工。

SELECT Id, Name FROM Employee WHERE CompanyId=1

我不擅长 SQL。帮我解决这个问题。

4

3 回答 3

8

使用 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

SQL Fiddle 与演示

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,现在增加了层次结构。

于 2013-03-17T14:22:57.810 回答
2
SELECT 
   employee.name,
   company.id 
FROM employee
INNER JOIN company 
On employee.companyId= company.id
WHERE company.id IN (1,2,3)
于 2016-12-07T05:09:32.110 回答
0

这对于查询是正确的,因为您只询问公司 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)

希望这可以帮助。

于 2013-03-17T14:13:53.740 回答