2

我有一个需要执行的查询,但我不知道如何构建。

我有一张名为员工的表。我还有另一张桌子叫公司。还有第三个表名为 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

我究竟做错了什么?谢谢!

4

6 回答 6

5

尝试这个:

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
于 2009-10-27T20:19:16.643 回答
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
于 2009-10-27T20:54:09.023 回答
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
于 2009-10-27T20:34:10.687 回答
0

以下语句使用递归连接来迭代管理其他员工的员工管理其他员工的员工......等等。我们的结构有点复杂,因为管理结构是基于角色的,实际上允许员工拥有超过 1 个经理。您可以在此递归中添加对 Files 的引用。

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
于 2013-11-11T10:52:25.253 回答
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
于 2009-10-27T20:16:02.563 回答
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
于 2009-10-27T21:04:34.760 回答