我知道这是普通的问题,但我需要更多的东西。我有一个关于获取未插入一个表中的值的问题。
好的,这是我的桌子:
我的问题:如何为每位员工获取缺失值?假设我需要ID = 213的员工缺少插入内容?
到目前为止,我写了这个,但它还没有工作,就好像一天有一个工人插入一样,它为所有工人消除了一天。
代码:
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的检查?
谢谢你们,如果你需要更多东西,我随时都可以。
编辑:
这是样本:
雇工:
山姆
迈克
乔。
importantDate:
1. 2013-01-01
2. 2013-01-02
3. ...
40. 2013-02-23
刀片:
1. 2013-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 1
所以,当我运行查询时,我应该得到所有“缺失”插入。对于每个员工,我应该在缺少插入时获得员工的日期和ID。很多数据,但重要的是要知道哪些未插入,哪些是。
答案 0 :(得分:0)
而不是LEFT OUTER JOIN使用简单的LEFT JOIN并正确提供日期
SELECT
i.date
FROM importantDates i
LEFT JOIN inserts s
ON i.date = DATE(s.date)
WHERE i.date BETWEEN '2013-01-01'
AND '2013-02-23'
AND s.date IS NULL;
答案 1 :(得分:0)
我不太确定我是否理解,你想要实现的目标,但是如果你想从table_a
获取不属于table_b
的每一行,你可以这样做:< / p>
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
- 子句的更多文档,请参阅mysql documentation
<强>更新强>
要获得相应的员工, 可以 将声明更改为:
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';
但是,这是 不 值得推荐,因为子查询是correlated到主查询。
答案 2 :(得分: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