1

私はprojectテーブルを持っています。各行は、プロジェクトのサービスまたは製品です。

Project  Contractor  Service
=======  ==========  =======
  1         B           S1
  1         A           S2
  1         A           S3
  1         C           S1
  2         D           S2
  2         A           S1
  2         B           S3
  3         E           S2
  3         B           S1
  3         C           S2

プロジェクトで S2 を提供し、S2 を提供した同じプロジェクトで他のサービスを提供していない請負業者を見つけたいと考えています。

1  NULL
2  D
3  E
3  C

SQL でデータを取り出し、Excel でフィルター処理してグループ化しましたが、SQL でそれを行う方法を見つけたいと思います。SQL Server 2005 を使用しています。

4

2 に答える 2

2

私はアンチセミ結合(NOT EXISTSステートメント)を使用します:

SELECT AllS2.[Project],
    AllS2.[Contractor],
    AllS2.[Service]
FROM [StackoverflowProjects] AllS2
WHERE AllS2.[Service] = 'S2'
AND NOT EXISTS (SELECT NULL
    FROM StackoverflowProjects NonS2
    WHERE AllS2.Project = NonS2.Project 
    AND AllS2.Contractor = NonS2.Contractor 
    AND AllS2.Service <> 'S2')

説明の助けが必要な場合はお知らせください。ただし、機能します。

アップデート

最初に指摘しておきたいのは、エイリアスの名前をより抽象的でなく、できればより役立つように変更したことです。

プロジェクトで S2 を提供し、S2 を提供した同じプロジェクトで他のサービスを提供していない請負業者を見つけたいと考えています。

この声明から、S2 サービスのみを提供する請負業者が必要であることがわかりました。そのNOT部分にまだ慣れていない場合、その部分は少し難しいかもしれませんEXISTS

それでは、反対のことをして、それが何をするのか説明しましょう。

SELECT AllS2.[Project],
    AllS2.[Contractor],
    AllS2.[Service]
FROM [StackoverflowProjects] AllS2
WHERE AllS2.[Service] = 'S2'
AND EXISTS (SELECT NULL
    FROM StackoverflowProjects NonS2
    WHERE AllS2.Project = NonS2.Project 
    AND AllS2.Contractor = NonS2.Contractor 
    AND AllS2.Service <> 'S2')

には、S2 サービスと S2 以外のサービスを実行したすべての請負業者のプロジェクトが表示されます。

また、最初に学習したときにセミ結合 ( ) とアンチセミ結合 ( )の利点を理解するのに役立ったブログ記事へのリンクもここにあります。EXISTSNOT EXISTS

于 2013-05-21T01:21:42.433 に答える
0
;WITH ServiceCount AS (
    -- Contractor projects that have only one service
    SELECT Project, Contractor, COUNT(*) as [Count]
    FROM Projects
    GROUP BY Project, Contractor
    HAVING COUNT(*) = 1
)
SELECT
    sc.Project,
    sc.Contractor
FROM ServiceCount sc
JOIN Projects p
    ON p.Project = sc.Project
    AND p.Contractor = sc.Contractor
WHERE p.Service = 'S2'
于 2013-05-21T00:51:16.880 に答える