LEFT JOIN表中筛选checktime或pin为NULL值的SQL查询问题
解决LEFT JOIN后NULL值查询无结果的问题
问题根源
SQL里的NULL代表未知值,没法用普通的等于(=)运算符判断。你写的cio.checktime=NULL会直接返回空结果,因为任何值和未知值的比较结果都是未知,不会匹配到任何记录。必须用IS NULL来判断字段是否为NULL。
修改后的SQL语句
要检索cio.checktime或cio.pin为NULL的记录,同时满足emp.status=0,可以用下面的语句:
SELECT emp.`emp_id`, cio.`pin`, cio.`checktime` FROM payroll.employees AS emp LEFT JOIN ( SELECT * FROM zkteco_biotime.checkinout WHERE checktime > "2022-09-20 23:59:59" ) AS cio ON emp.emp_id = cio.pin WHERE emp.status=0 AND (cio.checktime IS NULL OR cio.pin IS NULL) GROUP BY emp.emp_id ORDER BY cio.checktime DESC;
补充说明
- 用
(cio.checktime IS NULL OR cio.pin IS NULL)来匹配任意一个字段为NULL的情况 - 注意
ORDER BY cio.checktime DESC中,如果checktime是NULL,不同数据库里排序时NULL默认位置可能有差异,一般会排在末尾 - 部分数据库开启严格模式(比如MySQL的ONLY_FULL_GROUP_BY)时,
GROUP BY emp.emp_id可能因为选中的非聚合字段未在GROUP BY中而报错,这时可以根据需求改用聚合函数(比如MAX(cio.checktime))或调整GROUP BY规则
内容的提问来源于stack exchange,提问作者Saqibuddin Siddique
相关产品推荐
相关产品推荐

