2009-10-27 101 views
1

我有一个查询,我需要执行,我不知道如何构建的SQL Server 2005 - 。嵌套递归查询:(

我有一个表叫员工我有一个名为公司另一个表有第三个名为Files的表格,你可以想象,公司有员工,员工有文件

我需要列出我的数据库中的所有雇员,挑战是,我需要列出总数在同一家公司的员工档案我曾尝试在没有任何运气以下变化:

SELECT 
    e.FirstName, 
    e.LastName, 
    e.Company, 
    (SELECT COUNT(*) FROM Files f WHERE f.EmployeeID IN (SELECT [ID] FROM Employees e2 WHERE e2.CompanyID=e.CompanyID)) as 'FileCount' 
FROM 
    Employees e 

我做错了什么?谢谢!

+1

我不是100%确定你想要得到什么。明确列出所有员工,但“FileCount”应该是什么? ** Employee **拥有的文件数量?或员工**公司**拥有的文件数量? – MatBailie 2009-10-27 20:52:27

+0

@Dems:他拼出来很清楚:“我需要列出在同一家公司的员工档案总数” – Kip 2009-10-28 00:30:23

+0

@Kip:恕我直言,这不是其他人如何interpretted的OP。我像你一样解释它,其他人解释不同。我要求澄清。如果你有问题需要澄清的人,我建议你问自己为什么这是一个问题给你... – MatBailie 2009-10-28 14:41:23

回答

4

试试这个:

SELECT 
    e.FirstName, 
    e.LastName, 
    e.Company, 
    (
    SELECT COUNT(*) 
    FROM Files f 
    JOIN Employees e2 ON f.EmployeeID = e2.id 
    WHERE e2.CompanyID = e.CompanyID 
) as 'FileCount' 
FROM 
    Employees e 
0

如何:

SELECT 
    e.FirstName, 
    e.LastName, 
    e.Company, 
    select count(*) from Files f, Employees e where f.EmployeeID=e.EmployeeID and e.CompanyID=emp.CompanyID 
FROM 
    Employees emp 
+1

坏主意使用前ANSi-92加入(在WHERE子句) – gbn 2009-10-27 20:28:48

1

在SELECT子句不相关的解决方案。可能更快......

SELECT 
    e.FirstName, 
    e.LastName, 
    e.Company, 
    foo.FileCount 
FROM 
    Employees e 
    JOIN 
    (
    SELECT 
     COUNT(*) AS FileCount, --OR COUNT(DISTINCT something) ? 
     e2.Company, f.EmployeeID 
    FROM 
     Files f JOIN Employees e2 ON f.EmployeeID = e2.id 
    GROUP BY 
     e2.Company, f.EmployeeID 
    ) foo ON e.Company = foo.Company AND e.id = foo.EmployeeID 
2

有很多方法可以得到这个。如果性能是一个问题,根据估计的执行计划成本,这是更优化的。

SELECT 
    e.FirstName, 
    e.LastName, 
    e.Company, 
    COUNT(f.FileId) 
FROM 
    Employees e 
    INNER JOIN Files f ON e.EmployeeID = f.EmployeeID 
GROUP BY 
    e.FirstName, 
    e.LastName, 
    e.Company 
+0

是的,最简单的。最好是我的。 – gbn 2009-10-27 21:02:31

+0

但是这不会给出给定员工拥有的文件数量吗?他希望同一家公司的所有员工的文件数量与特定员工的差异 – Kip 2009-10-28 00:33:22

+0

每个员工都属于一家公司,每个加入的文件都属于一名员工。查询返回员工信息加上他们的文件数量。您可以将其过滤到WHERE e.Company = xxx。 – 2009-10-28 00:58:52

0
WITH FilesPerCompany (CompanyID, NumberOfFiles) 
AS (SELECT  c.ID AS CompanyID, 
       COUNT(*) AS NumberOfFiles 
    FROM  Companies c 
    INNER JOIN Employees e ON c.ID = e.CompanyID 
    INNER JOIN Files f  ON e.ID = f.EmployeeID 
    GROUP BY c.ID 
) 

SELECT  e.FirstName, 
      e.LastName, 
      e.Company, 
      COALESCE(s.NumberOfFiles, 0) AS NumberOfFilesPerCompany 
FROM  Employees e 
LEFT JOIN FilesPerCompany s 
     ON s.CompanyID = e.CompanyID 
0

以下语句使用递归加入到循环下来谁管理谁管理其他员工的其他员工的员工....等我们的结构是一个有点令人费解的管理结构是基于角色实际上允许一名员工拥有1名以上的经理。您可以在此递归中添加对文件的引用。

WITH Manager as 
(SELECT c.Forenames + ' ' + c.Surname as Employee, 
    c2.Forenames + ' ' + c2.Surname AS Manages, 
    c.accountid AS AccountID, c.[Status] AS [Status] 
    FROM [intranet].[dbo].[tblContact] c 
    LEFT JOIN tblContactPost cp ON cp.contactid = c.contactid 
    LEFT JOIN tblPost p ON p.ParentRoleId = cp.RoleID AND p.ParentPostArea = cp.PostArea AND p.ParentPostNo = cp.PostNo 
    INNER JOIN tblContactPost cp2 ON cp2.RoleId = p.RoleId AND cp2.PostArea = p.PostArea AND cp2.PostNo = p.PostNo 
    INNER JOIN tblContact c2 ON c2.ContactID = cp2.ContactId 
) 
    ,jn AS 
    (SELECT Employee, Manages 
    FROM Manager 
    Where AccountID = 'ad\lgardner' AND [Status] = 'A' 
    UNION ALL 
    SELECT c.Employee, c.Manages 
    FROM jn as p JOIN Manager AS c 
    ON c.Employee = p.Manages 
    ) 
SELECT jn.Employee, jn.Manages 
From jn 
Order BY 1