0
SELECT Surname
FROM Worker
WHERE NOT EXISTS
(
SELECT *
FROM Project, Works_at
WHERE NOT EXISTS
(
SELECT *
FROM Works_at
WHERE Works_at.WorkerId =Worker.Id
AND Works_at.PNum = Project.PNumber
)
);

また

SELECT Surname
FROM Worker
WHERE NOT EXISTS (
SELECT *
FROM Works_at
WHERE Id = WorkerId
);

クエリを実行すると、"SELECT" の近くに構文エラーがあると表示されます。最初に、すべてのプロジェクトで作業するワーカーを選択します。2 つ目は、ワーカーがどのプロジェクトでも機能しないことを選択します。前もって感謝します

テーブルは

Worker = {名前、姓、ID、給与、DptNum}

部門 = {DptName, DptNumber}

Works_at = {WorkerId、PNum、時間}

Project={PName, PNumber, DptNum} および

Works_at(WorkerId) → Worker(Id)

Works_at(PNum) → プロジェクト(PNumber)

プロジェクト(DptNum) → 部署(DptNumber)

Worker(DptNum) → 部署(DptNumber)

4

2 に答える 2

2

NOT IN 副選択はパフォーマンスに悪影響を及ぼします。LEFT-JOIN でヒットし、NULL をテストする方が良い (つまり、一致がない)

SELECT 
      W.Surname
   FROM 
      Worker W
         LEFT JOIN Works_At WA
            on W.ID = WA.WorkerID
            LEFT JOIN Project P
               on WA.PNum = P.PNumber
   WHERE
      P.PNumber IS NULL

これにより、プロジェクトに関連付けられていない人のリストが表示されます。これは、Works At ロケーションの可能性があるが、プロジェクトが割り当てられていないことに基づいています。テーブルの作品にレコードがない場合は、次のようにするとさらに簡単になります

SELECT 
      W.Surname
   FROM 
      Worker W
         LEFT JOIN Works_At WA
            on W.ID = WA.WorkerID
   WHERE
      WA.WorkerID IS NULL
于 2012-12-04T19:05:52.980 に答える
1

サブクエリでプロジェクト テーブルを使用できないため、Works_at.PNum = Project.PNumber にアクセスできません。

于 2012-12-04T19:07:46.210 に答える