优化这段代码 select * FROM((shift_log INNER JOIN etl_shift_stat ON shift_log.ID=etl_shift_stat.SHIFT_LOG_ID) INNER JOIN etl_point ON etl_shift_stat.POINT_ID=etl_point.POINT_ID) INNER JOIN sys_team ON shift_log.TEAM_ID=sys_team.TEAM_ID where POINT_NAME IN('W3.DL.DL017','W3.DL.DL037','W3.NCS.99POW0300') and shift_log.PER_DATE>=concat(substr(:date,1,7),'-01') and shift_log.PER_DATE<=:date order by PER_DATE
时间: 2023-06-14 18:03:47 浏览: 100
首先,可以将查询条件中的 POINT_NAME 和 PER_DATE 提前筛选,可以减少 JOIN 操作的数据量。同时,可以使用 BETWEEN 来代替 PER_DATE 的范围查询。
优化后的代码如下:
SELECT *
FROM (
SELECT *
FROM shift_log
WHERE PER_DATE BETWEEN CONCAT(SUBSTR(:date, 1, 7), '-01') AND :date
) AS a
INNER JOIN etl_shift_stat ON a.ID = etl_shift_stat.SHIFT_LOG_ID
INNER JOIN etl_point ON etl_shift_stat.POINT_ID = etl_point.POINT_ID AND etl_point.POINT_NAME IN ('W3.DL.DL017', 'W3.DL.DL037', 'W3.NCS.99POW0300')
INNER JOIN sys_team ON a.TEAM_ID = sys_team.TEAM_ID
ORDER BY a.PER_DATE
这样能够更快速地得到查询结果。
相关问题
select * FROM((shift_log INNER JOIN etl_shift_stat ON shift_log.ID=etl_shift_stat.SHIFT_LOG_ID) INNER JOIN etl_point ON etl_shift_stat.POINT_ID=etl_point.POINT_ID) INNER JOIN sys_team ON shift_log.TEAM_ID=sys_team.TEAM_ID where POINT_NAME IN('W3.DL.DL017','W3.DL.DL037','W3.NCS.99POW0300') and shift_log.PER_DATE>=concat(substr(:date,1,7),'-01') and shift_log.PER_DATE<=:date order by PER_DATE
这是一条 SQL 查询语句,它的作用是从四个表中获取符合条件的数据,并按照 PER_DATE 字段进行排序。其中,shift_log、etl_shift_stat、etl_point、sys_team 分别代表班次记录、转换统计、转换点和班组四个表。
具体查询条件如下:
1. 符合 POINT_NAME 字段为 'W3.DL.DL017'、'W3.DL.DL037' 或 'W3.NCS.99POW0300' 的记录。
2. 符合 PER_DATE 字段在指定时间段内的记录,时间段为 :date 的月份的第一天到最后一天。
3. 按照 PER_DATE 字段进行升序排序。
其中 :date 为占位符,需要在实际执行时传入具体的日期参数。
阅读全文