3

EMPLOYEESテーブルから3つ以上のプロジェクトに取り組んでいるテーブルのすべての従業員の名前を表示したいと思いPROJECTます。

PROJECTS.PersonIDは外部キー参照EMPLOYEES.IDです:

SELECT NAME, ID 
FROM EMPLOYEES
WHERE ID IN
    ( 
    SELECT PersonID, COUNT(*)
    FROM PROJECTS
    GROUP BY PersonID
    HAVING COUNT(*) > 3
    )

そのサブクエリに両方を含めることはできますPersonIDCOUNT(*)、それとも1つの列のみにする必要がありますか?

4

2 に答える 2

5

句に含まれていませんIN(または、少なくとも使用しようとしている方法ではありません。一部のRDBMSでは、IN句に複数の列を持つタプルが許可されていますが、ここでは役に立ちません)

目的の結果を得るにCOUNT(*)は、リストからを削除する必要があります。SELECT

SELECT NAME, ID 
FROM EMPLOYEES
WHERE ID IN
    ( 
    SELECT PersonID
    FROM PROJECTS
    GROUP BY PersonID
    HAVING COUNT(*) > 3
    )

カウントも返したい場合は、複数の列を持つ派生テーブルまたは共通テーブル式に結合できます。

SELECT E.NAME,
       E.ID,
       P.Cnt
FROM   EMPLOYEES E
       JOIN (SELECT PersonID,
                    Count(*) AS Cnt
             FROM   PROJECTS
             GROUP  BY PersonID
             HAVING Count(*) > 3) P
         ON E.ID = P.PersonID
于 2012-09-20T23:10:43.260 に答える
1

質問に答えるために、INサブクエリには1つの列しか含めることができません。以下のクエリを使用して結果を取得できます。

SELECT e.ID
      ,e.Name 
FROM dbo.Projects p
LEFT OUTER JOIN dbo.Employees e
    ON p.PersonID = e.ID
GROUP BY e.ID
        ,e.Name 
HAVING COUNT(*) > 3
于 2012-09-20T23:20:29.630 に答える