选择父记录和子记录

时间:2013-03-17 14:09:55

标签: sql sql-server sql-server-2008

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

使用SQL Server 2008

员工

Id | Name | CompanyId  

公司

Id | Name | ParentCompanyId  

示例:

1 Microsoft 0

2 Microsoft India 1

3 Microsoft Spain 1

我在下面的查询中仅提供来自Microsoft的员工,而不是来自Microsoft India&西班牙。

SELECT Id, Name FROM Employee WHERE CompanyId=1

我不擅长SQL。帮助我。

3 个答案:

答案 0 :(得分:7)

使用CTE构建公司层次结构,然后将其连接回Employees表:

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 with demo

如果要对语句进行参数化,还可以将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,现在添加了层次结构级别。

答案 1 :(得分:1)

yum install jdk

答案 2 :(得分: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)

希望这有帮助。