2

構造化の方法がわからない、実行する必要のあるクエリがあります。

Employeesというテーブルがあります。Companyという別のテーブルがあります。Filesという3番目のテーブルがあります。ご想像のとおり、会社には従業員がいて、従業員にはファイルがあります。

データベース内のすべての従業員をリストする必要があります。課題は、従業員と同じ会社のファイルの総数をリストする必要があるということです。私は運がなくて次のバリエーションを試しました:

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

どうですか:

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 に答える
0

次のステートメントは、再帰的結合を使用して、他の従業員を管理する他の従業員を管理する従業員を反復処理します...など。管理構造は役割ベースであり、実際には従業員が複数のマネージャーを持つことができるため、構造は少し複雑です。この再帰内でファイルへの参照を追加できます。

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 に答える