2016-11-10 3 views
2

は、従業員が同時に1つまたは複数のジョブを実行することができますので、データベースは次のように構成されています結合と一致するレコード以外のレコードの選択方法は?当社のWebアプリケーションで

http://rextester.com/VTFND62465

テーブルtma_employee

emp_id | emp_name 
-------|--------- 
1  | BOB 
2  | MAX 
3  | SALLY 

テーブルtma_job

job_id | job_name 
-------|--------- 
1  | DEV 
2  | SALES 
3  | MGMT 

従業員と仕事の関係表tma_employee_job

この構造を考えると
emp_id | job_id 
-------|------- 
1  | 1 
1  | 2 
2  | 2 
2  | 3 
3  | 3 
3  | 1 

、一つ以上の特定のジョブを実行するすべての従業員を選択することは簡単です:

SELECT DISTINCT E.* 
FROM tma_employee E 
JOIN tma_employee_job EJ USING (emp_id) 
JOIN tma_job J USING (job_id) 
WHERE J.job_name = 'DEV'; 

しかし、どのように私はないを行うすべての従業員がいることを実行する選択することができますジョブ?

私はこのような状態を反転しようとした:

SELECT DISTINCT E.* 
FROM tma_employee E 
JOIN tma_employee_job EJ USING (emp_id) 
JOIN tma_job J USING (job_id) 
WHERE J.job_name != 'DEV'; 

しかし、これは動作しません。例えば、BOBはDEVと違って、販売の仕事でもあるので、従業員BOBがから発見された、ので、上記のクエリ。また、私は、これが機能することを発見した

:メインクエリはに基づいて、機能によって構築されているので、

SELECT DISTINCT E.* 
FROM tma_employee E 
WHERE E.emp_id NOT IN (
    SELECT EJ.emp_id 
    FROM tma_employee_job EJ 
    JOIN tma_job J USING (job_id) 
    WHERE J.job_name = 'DEV' 
); 

はしかし、それは、私が避けたいサブクエリを使用するように私を必要とし受信するパラメータは、SELECT E.* FROM tma_employee Eから始まり、さまざまなJOINSおよび句をすべて追加します。

サブクエリを使用するクエリと同じ結果を得ることは可能ですか?単純なジョインに固執しますか?

SELECT DISTINCT E.* 
FROM tma_employee E 
LEFT JOIN (
    SELECT EJ.emp_id 
    FROM tma_employee_job EJ 
    JOIN tma_job J USING (job_id) 
    WHERE J.job_name = 'DEV' 
) T ON E.emp_id = T.emp_id 
WHERE T.emp_id IS NULL 

答えて

3

SQL DEMOサブクエリなし::

+0

私はあなたがそれを釘付けにしたと思います! –

+0

これは正しく動作すると思われ、クエリビルダ機能で管理するのは簡単です...私はできるだけ早く試してみます。 –

1

これを試してみてください

SELECT E.emp_id, E.emp_name 
FROM tma_employee E 
LEFT JOIN tma_employee_job EJ USING (emp_id) 
LEFT JOIN tma_job J ON J.job_id = EJ.job_id 
GROUP BY E.emp_id, E.emp_name 
HAVING COUNT(CASE WHEN job_name = 'DEV' THEN 1 END) = 0; 
+0

作品を、まだ私は本当にサブクエリをイマイチ –

+0

@MatteoTassinariを避けたいのですが、サブクエリを使用して、あります派生テーブルパフォーマンスに問題はありません。 –

+0

@JuanCarlosOropezaあなたは正しいですが、私の問題はパフォーマンスではありませんが、既に十分に複雑なクエリ文字列をdinamically作成する関数...私はこの問題を私が望むように解決できないかもしれません。 –

関連する問題