使用period表数据作为trans与master关联查询的WHERE条件报错求助
解决MySQL 1064语法错误:修正跨表条件查询语句
看起来你遇到了MySQL的语法解析错误(错误码1064),问题出在WHERE子句里的BETWEEN条件写法上——SQL里BETWEEN需要直接跟两个明确的边界值,不能像你那样嵌套IN(SELECT ...)子查询。咱们一步步来修正这个问题:
错误原因分析
你的原语句中这部分写法不符合SQL规范:
pdate BETWEEN STRDate IN(SELECT STRDate FROM period) AND ENDDate IN (SELECT ENDDate FROM...
IN子查询会返回多个结果集,但BETWEEN要求左右两边都是单个值,MySQL无法解析这种混合写法,所以抛出1064错误。
修正后的查询语句
假设period表中存储的是你需要的时间段的起始(STRDate)和结束(ENDDate),分两种常见情况处理:
情况1:period表只有一条时间段记录
如果period表里只存了一组全局的起止日期,直接用标量子查询获取单个值即可:
SELECT b.projname AS companies, SUM(a.otreg_h) AS hours, SUM(a.otreg_m) AS minutes FROM trans AS a JOIN MASTER AS b ON a.empno = b.empno WHERE a.otreg_h != 0 AND a.otreg_m != 0 AND a.pdate BETWEEN (SELECT STRDate FROM period LIMIT 1) AND (SELECT ENDDate FROM period LIMIT 1) GROUP BY b.projname; -- 补充GROUP BY,聚合查询必须对非聚合字段分组,否则MySQL严格模式下会报错
情况2:period表有多条记录,需要关联筛选
如果period表有多个时间段(比如每个项目对应一个时间段),你需要先关联period表再筛选:
SELECT b.projname AS companies, SUM(a.otreg_h) AS hours, SUM(a.otreg_m) AS minutes FROM trans AS a JOIN MASTER AS b ON a.empno = b.empno JOIN period AS p ON b.projname = p.projname -- 假设按项目关联period,可根据实际业务调整关联字段 WHERE a.otreg_h != 0 AND a.otreg_m != 0 AND a.pdate BETWEEN p.STRDate AND p.ENDDate GROUP BY b.projname;
额外优化建议
- 如果你的需求是只要有加班时长就统计(不是必须小时和分钟都不为0),可以把
otreg_h != 0 AND otreg_m != 0改成(otreg_h > 0 OR otreg_m > 0),避免漏掉只有小时或只有分钟的加班记录。 - 确保
pdate、STRDate、ENDDate字段的类型一致(都是DATE/DATETIME类型),避免隐式转换导致的性能问题或筛选错误。
内容的提问来源于stack exchange,提问作者Keith Yung
相关产品推荐
相关产品推荐

