选择父记录和子记录

Bil*_*lla 3 sql sql-server sql-server-2008

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

使用SQL Server 2008

雇员

Id | Name | CompanyId  
Run Code Online (Sandbox Code Playgroud)

公司

Id | Name | ParentCompanyId  
Run Code Online (Sandbox Code Playgroud)

例:

1 Microsoft 0

2微软印度1

3 Microsoft Spain 1

我有下面这个查询,它只给微软的员工,而不是微软的印度和西班牙.

SELECT Id, Name FROM Employee WHERE CompanyId=1
Run Code Online (Sandbox Code Playgroud)

我不擅长SQL.帮助我.

Ian*_*ton 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
Run Code Online (Sandbox Code Playgroud)

SQL小提琴演示.

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
Run Code Online (Sandbox Code Playgroud)

SQL小提琴演示,现在添加了层次结构级别.