Sql 选择父记录和子记录
如何选择公司及其子公司的所有员工 使用SQLServer2008 员工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
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)