1

次の構造を持つテーブル「出席」に従業員の出席を保存しています。

EmpID, CDate

出席システムは、その特定の日に出席するすべての従業員の従業員 ID を使用して、このテーブルを毎日挿入します。

特定の従業員の欠勤届を調べる必要があります。従業員が存在する日付以外のすべての異なる日付を選択することで、これを簡単に行うことができます。

そのSQLステートメントのnot in演算子を削除する方法はありますか? 助けてください

EmpId 01 の従業員の SQL クエリは次のとおりです。

select distinct CDate 
  from attendance 
  where CDate not in (
      Select CDate from attendance where EmpID='01') 
4

2 に答える 2

1

各従業員のデータを毎日保存するようにメカニズムを変更できます。はい、多くの行が追加されますが、ログに記録されたデータからすべての日付を確実に取得するにはどうすればよいでしょうか? 今日誰も仕事に来なかったら?誰も欠席しないの?

あなたが行くなら:

EmpID, CDate, Present
1, {date}, 0|1

そうすれば、テーブルサイズと引き換えに、よりシンプルで高速なクエリが得られます。

select CDate from attendance where EmpID = 1 and status = 0;
于 2012-04-18T07:00:44.690 に答える
1

問題は NOT IN 句ではなく、サブクエリです。

次のようなものが必要です。

SELECT DISTINCT a1.CDate, if (EmpID=NULL, false,true) as Present
FROM attendance as a1
LEFT JOIN attendance as a2 USING (CDate) 
WHERE a2.EmpID='01'

これは、すべての日付を取得し、それに従業員の出席状況を結合するデカルト結合です。サブクエリよりも大幅に高速になるはずです。


テスト済みのコードで更新:

SELECT DISTINCT a1.CDate, IF (a2.EmpID IS NULL, false,true) as Present
FROM attendance AS a1
LEFT JOIN attendance AS a2 ON (a1.CDate = a2.CDate AND a2.EmpID='01') 

前の回答が悪いです。サブセレクションを集計の代わりに ON に入れる必要がありました。

于 2012-04-18T07:01:53.143 に答える