* 作業テーブル  
ID、作業番号...

  * 作業詳細テーブル  
ID、作業ID、作業開始時間、作業終了時間...

  * 作業明細テーブル（作業詳細テーブル 1-多 作業明細テーブル)  
ID、作業詳細ID、作業内容、宿泊費...

うろ覚えですがこんな感じのテーブルがありまして、作業内容にhogehogeもしくはnullnullという言う文字列が入っていない作業番号を知りたいのですが  
試行錯誤しながら副問い合わせを使ってもできません。以下の感じになりました  
作業詳細テーブルと作業明細テーブルは一対多の関係にあり  
たとえば作業詳細テーブル１つに作業明細テーブル３つが結びついている場合、３つともhogehoge、nullnullを含まない作業番号を抽出したいのですができません

```

    SELECT 作業番号
    FROM 作業テーブル INNER JOIN 作業詳細テーブル ON 作業テーブル.ID = 作業詳細テーブル.作業ID
    WHERE 作業詳細テーブル.ID IN
    (SELECT 作業詳細ID
    FROM 作業明細テーブル
    WHERE 作業内容 NOT LIKE '%hogehoge%' AND 作業内容 NOT LIKE '%nullnull%')
    
```

これでもだめでした

```

    SELECT distinct 作業番号
    FROM 作業テーブル,作業詳細テーブル,作業明細テーブル
    WHERE
    作業テーブル.ID = 作業詳細テーブル.作業ID AND
    作業詳細テーブル.ID = 作業明細テーブル.作業詳細ID AND
    NOT (作業明細テーブル.作業内容 LIKE '%hogehoge%' OR
    作業明細テーブル.作業内容 LIKE '%nullnull%')
    
```

どうすれば特定の文字列が入っていない作業番号を抜き出すことができるでしょうか？教えてください
CC BY-SA 3.0
2017-06-29T13:39:14.833
35975
2018-08-15T07:00:44.993
2017-06-29T14:52:55.627
21092
20468
question
sql-server
SQL Server、一対多のテーブルの時の問い合わせ
すべての「作業ID」から当該文字列を含む「作業ID」を除外すればよいです。

前者は

```

    SELECT ID FROM 作業テーブル
    
```

後者は

```

    SELECT 作業詳細テーブル.作業ID
      FROM 作業詳細テーブル
     INNER JOIN 作業明細テーブル
        ON 作業詳細テーブル.ID = 作業明細テーブル.作業詳細ID
     WHERE 作業内容 LIKE '%hogehoge%'
        OR 作業内容 LIKE '%nullnull%'
    
```

で取得できますので、`EXCEPT`演算子を使用して以下のようになります。

```

    SELECT ID FROM 作業テーブル
    EXCEPT
    SELECT 作業詳細テーブル.作業ID
      FROM 作業詳細テーブル
     INNER JOIN 作業明細テーブル
        ON 作業詳細テーブル.ID = 作業明細テーブル.作業詳細ID
     WHERE 作業内容 LIKE '%hogehoge%'
        OR 作業内容 LIKE '%nullnull%'
    
```
CC BY-SA 3.0
2017-06-29T14:07:30.790
35977
2017-06-29T14:07:30.790
5750
35975
answer