0

私はこれが普通の質問であることを知っていますが、もっと何かが必要です. 1 つのテーブルに挿入されていない値の取得について問題があります。

ここに私のテーブルがあります:

  1. 名前:重要な日付; 列: ID、日付
  2. 名前: 挿入; 列: ID、日付、employe_id

私の質問: 各従業員の欠損値を取得するにはどうすればよいですか? ID = 213 の従業員からの挿入が欠落している必要があるとしましょう。

ここまで書いてきましたが、1日1人の労働者の挿入があって、全労働者の1日をなくすように、まだうまくいきません。

コード:

SELECT i.date 
FROM importantDates i 
   LEFT OUTER JOIN inserts s 
        ON i.date = DATE(s.date) 
WHERE i.date BETWEEN '2013-1-1' 
    AND '2013-2-23' 
   AND s.date IS NULL;

次に、employe_id のチェックを追加するにはどうすればよいですか?

皆さん、ありがとうございます。さらに何か必要な場合は、いつでも対応できます。

編集 :
サンプル は 次 の
とおり です

_ _ _ _ -02-01, 1 2. 2013-02-01, 2 3. 2013-02-01, 3 4. 2013-02-02, 3 5. 2013-02-03, 1 6. 2013-02-03, 2 7. 2013-01-12, 1
















したがって、クエリを実行すると、「不足している」挿入がすべて取得されるはずです。従業員ごとに、挿入が欠落しているときに従業員の日付と ID を取得する必要があります。多くのデータがありますが、どれが挿入されていないか、どれが挿入されているかを知ることが重要です。

4

3 に答える 3

0

あなたが何を達成しようとしているのか、私が理解しているかどうかはよくわかりませんが、table_a含まれていないすべての行を取得したい場合は、次のようにtable_bすることができます。

SELECT * FROM table_a 
WHERE table_a.col NOT IN 
( 
    SELECT col FROM table_b
)

だから(私があなたを正しく理解しているなら)あなたの場合:

SELECT i.date FROM importantDates i 
WHERE i.date NOT IN 
(
    SELECT date FROM inserts WHERE employe_id = 213
) 
AND i.date BETWEEN '2013-01-01' AND '2013-02-23';

IN-clauseのその他のドキュメントについては、 mysqlのドキュメントを参照してください。

アップデート:

対応する従業員を取得するには、ステートメントを次のように変更できます。

SELECT i.date, e.* FROM importantDates i 
JOIN employees e
WHERE i.date NOT IN 
(
    SELECT s.date FROM inserts s WHERE s.employe_id = e.employe_id
) 
AND i.date BETWEEN '2013-01-01' AND '2013-02-23';

ただし、サブクエリはメインクエリに関連付けられているため、これはお勧めできません

于 2013-02-23T11:30:58.677 に答える
0

employeeテーブルがあると仮定して、次のことを試してください。

select sq.* from
(select e.employe_id, i.date
 FROM importantDates i
 CROSS JOIN employee e
 WHERE i.date BETWEEN '2013-1-1' AND '2013-2-23') sq
LEFT OUTER JOIN inserts s 
  ON sq.date = DATE(s.date) and sq.employe_id = s.employe_id
WHERE s.date IS NULL;

別のテーブルがない場合は、上記のクエリを次のようにemployee変更することで、テーブルをシミュレートできます。employee

(select distinct employe_id from inserts) as e
于 2013-02-23T11:31:00.830 に答える