2016-08-10 9 views
1

従業員の完全なリストを検索するために使用しようとしている声明があります。私は休暇を取らなくても従業員を守りたいです。これはこれまでの私の声明です。条件がLEFT JOINのクエリから行を除外する

SELECT emp.em_pplid, emp.em_name 
FROM employs emp 
LEFT JOIN people ppl ON emp.em_pplid = ppl.pp_id 
LEFT JOIN empwork ew ON emp.em_pplid = ew.ew_pplid 
WHERE emp.em_deptid = ? 
AND ppl.pp_employee = ? 
AND emp.em_type < ? 
AND ew.ew_from > ? 
ORDER BY emp.em_name" 

それはempworkテーブルに格納されている休日を持たない従業員を削除しAND ew.ew_from = ?です。 empworkテーブルに休暇がなくても、私が望む部門IDを持つ従業員テーブルの全員をどのように保つことができますか?

+0

トピックはあなたの問題の説明と一致していないことを、彼らがいない場合、原因NULL比較にINNER JOINに移す自動的に参加します。 AND節が列ではなく行を削除すると聞こえます。誤解を避けるために修正してください。 –

答えて

0

where句はleft joininner joinに変換します。ジョインのon句に条件を入力します。 LEFT JOINテーブルの上に

SELECT emp.em_pplid, emp.em_name 
FROM employs emp 
LEFT JOIN people ppl ON emp.em_pplid = ppl.pp_id       
LEFT JOIN empwork ew ON emp.em_pplid = ew.ew_pplid 
        AND ew.ew_from > ? 
WHERE emp.em_deptid = ? 
AND emp.em_type < ? 
AND (ppl.pp_employee IS NULL OR ppl.pp_employee = ?) 
ORDER BY emp.em_name 
+0

このような高速返信をありがとう。これはうまくいきます。返されるべきでないものも 'ppl.pp_employee'がまだ返っているだけです。これはさらに上書きされますか? – CBreeze

+0

どのようにデータを正確に減らすべきかは不明です。あなたの質問にサンプルデータと予想される結果を加えてください。 –

+0

私は 'ppl.pp_employee = false'を削除するのに' sqlCmd.Parameters.AddWithValue( "pEmployee"、true); 'を使用していますが、それらはまだDataSetにあります。 – CBreeze

0

条件のみON句内で指定する必要があります。私はよく質問を理解していれば、これは働くかもしれ

SELECT emp.em_pplid, emp.em_name 
FROM employs emp 
LEFT JOIN people ppl 
ON emp.em_pplid = ppl.pp_id AND ppl.pp_employee = ? 
LEFT JOIN empwork ew 
ON emp.em_pplid = ew.ew_pplid AND ew.ew_from > ? 
WHERE emp.em_deptid = ? 
AND emp.em_type < ? 
ORDER BY emp.em_name" 
0

SELECT emp.em_pplid, emp.em_name 
FROM employs emp 
LEFT JOIN people ppl ON emp.em_pplid = ppl.pp_id 
LEFT JOIN empwork ew ON emp.em_pplid = ew.ew_pplid 
WHERE emp.em_deptid = ? 
AND ppl.pp_employee = ? 
AND emp.em_type < ? 
AND (ew.ew_from > ? OR ew.ew_from IS NULL) 
ORDER BY emp.em_name" 
関連する問題