Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择父记录和子记录_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 选择父记录和子记录

Sql 选择父记录和子记录,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,如何选择公司及其子公司的所有员工 使用SQLServer2008 员工 Id | Name | CompanyId 公司 Id | Name | ParentCompanyId 例如: 1 Microsoft 0 2微软印度1 3微软西班牙1 我在下面的查询中只给出了来自微软的员工,而不是来自微软印度和西班牙的员工 SELECT Id, Name FROM Employee WHERE CompanyId=1 我不擅长SQL。帮我做这个 这对于查询是正确的,因为您只需要公司id为1

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

使用SQLServer2008

员工

Id | Name | CompanyId  
公司

Id | Name | ParentCompanyId  
例如:

1 Microsoft 0

2微软印度1

3微软西班牙1

我在下面的查询中只给出了来自微软的员工,而不是来自微软印度和西班牙的员工

SELECT Id, Name FROM Employee WHERE CompanyId=1

我不擅长SQL。帮我做这个

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

希望这有帮助。

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

如果要参数化语句,还可以将
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

,现在添加了层次结构级别。

您可以使用。奇怪的是,您只是单击了“投票否决”按钮而没有尝试查询。为什么不试试,你就会得到结果。但是如果你想提供一个母公司id,那么情况就不同了。我回答了你在这里提出的问题。@LiaqatG,我投了赞成票。不知道是谁投了反对票。请核实,尽管您的答案可能不准确;)不管怎样,其他人投反对票-2,我的选票+10,你得+8分。@TimSchmelter我认为工会都在帮助我,我看到它用CTE包装起来了。我想这就是我最初尝试的。。但不确定这种方法对性能是否正确对于性能,恐怕您必须检查一下。如果我能找到更好的方法,我也会研究它。当然,这取决于数据量。如果你不处理成千上万的记录,那么我想你会没事的。不过我会再查一查。感谢是互联网的方式,SQL Fiddle链接断了
SELECT 
   employee.name,
   company.id 
FROM employee
INNER JOIN company 
On employee.companyId= company.id
WHERE company.id IN (1,2,3)