1

私は3つのテーブルを持っています

    Employee    
    SSN Name
    1   a
    2   b
    3   c

    Projects    
    Pno Name
    1   x
    2   y
    3   z

    Works_On    
    ESSN    Pno
    1       1
    1       2
    2       1
    3       1
    3       2
    3       3

さて、問題は、どの従業員がすべてのプロジェクトで働いているかを (クエリによって) どのように知ることができるかということです。マルチとマルチを比較することはできないようです。

ありがとう、そしてばかげた質問でごめんなさい。

4

3 に答える 3

4

これを行う 1 つの方法は、すべてのプロジェクトをカウントし、従業員のプロジェクト数をカウントしてから、同じ数のプロジェクトに取り組んでいるすべての従業員を選択することです。

DECLARE @ProjectCount int
SELECT @ProjectCount = Count(*) FROM Projects

SELECT e.* 
FROM Employee e
WHERE (SELECT COUNT(1) FROM Works_On w WHERE w.ESSN = e.SSN) = @ProjectCount

ProjectCount変数は、すべての従業員のプロジェクトのカウントをスキップするためにあります。

更新: 仕組み:

各従業員について、現在の従業員と同じWorks_Onフィールドを持つテーブルにあるレコードの数を数え、その数をプロジェクトの総数と比較します。クエリ:ESSNSSN

SELECT COUNT(1) FROM Works_On

テーブル内のレコードの総数が表示されWorks_Onます (この場合は 6)。各従業員のレコード数を数えたいので、Works_On現在の従業員のSSN. これを何らかのプログラミング言語で記述する必要がある場合、これは論理的にforeachは従業員コレクションのループと同等であり、ループの本体で現在の従業員のテーブルからすべてのレコードを選択しWorks_On、それをプロジェクトの総数と比較します。現在の従業員がプロジェクトの総数と同じ数のプロジェクトを持っている場合は、それをカウントします。

これが役立つことを願っています。

于 2012-06-12T08:20:28.303 に答える
0

これを試して:

SELECT Employee.Name, Projects_On
FROM (
    SELECT Works_On.ESSN, COUNT(*) AS [Projects_On] 
    FROM [Works_On] INNER JOIN [Projects] ON Projects.Pno = Works_On.PNO 
    GROUP BY [ESSN]) A 

INNER JOIN Employee ON Employee.SSN = Essn
WHERE Projects_On = (SELECT COUNT(*) FROM Projects) 

これはこれまでで最も美しいクエリではありませんが、うまくいくようです。

于 2012-06-12T08:56:52.183 に答える
0

私はに取り組みcountます。

SELECT e.SSN
FROM Employee e,
     (SELECT w.ESSN, COUNT(*) AS count FROM Works_On w WHERE w.ESSN = e.SSN GROUP BY w.ESSN) wcount,
     (SELECT COUNT(*) AS count FROM Projects) p -- you can avoid this by calculating it before. 
WHERE wcount.ESSN = e.SSN
AND p.count = wcount.count
于 2012-06-12T08:21:25.167 に答える