2016-12-10 4 views
-1

私は2つのテーブルを持っています。NOT INを使用している人を雇っていないプロジェクトを一覧表示します

プロジェクト

**p_id** | manager | name | date |  
t2   andrew CSO 11/12/13 

従業員

id | name | surname | id_division | sallary | **project**  
1 kate black   57  1500  t2 

と列プロジェクトとP_IDは、対応するのentiresです。

従業員以外のすべてのプロジェクトをリストしたいと思います。だから私はそれが正しい場合は、プロジェクトの列の従業員のテーブルにこのプロジェクトのp_idはありませんし、私はNOTの使用法でそれをしたいと思います。

私はこのようにそれを実行しようとしましたが、私は動作しません:

SELECT * 
FROM projects 
WHERE p_id NOT IN 
(SELECT project FROM Employees); 

これは、任意の行を選択しません。しかし、Projectsテーブルにあり、プロジェクト行のEmployeesテーブルに存在しないp_idを持っているため、従業員を持たないプロジェクトが1つあります。

+0

'project'カラムに' NULL'レコードがありますか? –

+0

はい私はいくつか持っています。 – qamyk

+0

あなたは答えを持っています –

答えて

1

サブクエリでNOT INを使用しないことを強くお勧めします。 サブクエリによって返された行の値がNULLの場合、何も返されません。

代わりに、NOT EXISTSを使用します。

SELECT p.* 
FROM projects p 
WHERE NOT EXISTS (SELECT 1 FROM employees e where e.project = p.p_id); 

これは、あなたが期待する意味を持っています。

あなたはNULL値フィルタリング場合NOT INを使用することができます。

SELECT p.* 
FROM projects p 
WHERE p.p_id NOT IN (SELECT e.project FROM Employees e WHERE e.project IS NOT NULL); 

をしかし、それはコーディングやデータエラーを受けにくいので、私はNOT EXISTSをお勧めします。

+0

ありがとう、本当に役に立ちました! – qamyk

+0

@qamyk - Gordonの答えに追加:NOT IN条件のリストにNULLが含まれる場合、何も選択されません。 NULLと異なることは保証されていません。 (より正式には、 'xは(a、b、NULL)ではない 'は' x <> aとx <> bとx <> NULL'を意味します)、最後はUNKNOWN、TRUE少なくとも1つの用語がUNKNOWNでTRUEではないため、ANDでリンクされている)はTRUEになることはありません。 – mathguy

関連する問題