select a.*,b.order_num,b.STAFF_NAME as FQ_STAFF_NAME,b.ORG_NAME,c.tch_cont_desc ,d.staff_name as DQ_STAFF_NAME, b.CUR_DATE ,c.begin_date,e.mean,f.mean as gjlx, g.max_check_time, h.finish_date, CASE WHEN a.GEJIE_BEGIN_TIME IS NOT NULL AND j.finish_date IS NOT NULL THEN DATEDIFF(a.GEJIE_BEGIN_TIME, j.finish_date) ELSE NULL END AS days_before_notification, i.created_date, i.finish_date from change_process_middle a LEFT JOIN sync_5110000012939 b ON a.ORDER_CODE =b.FLOW_ID LEFT JOIN tache c on a.ORDER_CODE =c.FLOW_ID LEFT JOIN staff d ON d.STAFF_ID =c.person LEFT JOIN codelist e ON e.code=b.Change_type LEFT JOIN codelist f ON f.code=b.release_type LEFT JOIN ( SELECT FLOW_ID, MAX(check_time) AS max_check_time FROM itsm_change_check GROUP BY FLOW_ID ) g ON a.ORDER_CODE = g.FLOW_ID LEFT JOIN tache h on a.ORDER_CODE =h.FLOW_ID and h.tch_mod = '10016903' LEFT JOIN tache i on a.ORDER_CODE =i.FLOW_ID and i.tch_mod ='10017802' LEFT JOIN tache j on a.ORDER_CODE =j.FLOW_ID and j.tch_mod ='1009646' where c.state ='A' and e.code_type='1004202_Change_type' and f.code_type='1086155_release_type_new'
时间: 2025-03-24 09:23:35 浏览: 47
您提供的SQL查询语句较为复杂,涉及多个表之间的连接 (`LEFT JOIN`) 和条件过滤 (`WHERE`) 操作。下面为您逐步解析并总结该查询的功能及关键点:
---
### **功能概述**
此SQL的主要目的是从多个关联表中提取数据,并通过计算生成一些额外字段(如`days_before_notification`),最终筛选出符合条件的结果。
**核心内容包括:**
1. 主表 `change_process_middle (a)` 提供主键和其他基础信息。
2. 通过左连接(`LEFT JOIN`)将其他辅助表的数据与主表结合,获取更多维度的信息。
3. 使用聚合函数(例如 `MAX()`)对部分数据进行处理。
4. 根据特定列值过滤结果集(如 `c.state='A'`, `e.code_type='...'` 等)。
5. 计算自定义的时间差字段(`DATEDIFF` 函数用于求两个日期之差)。
---
### **详细解析**
#### **1. 表连接结构**
- **主表**: `change_process_middle (a)`
- 此为主查询的基础,所有后续操作都围绕它展开。
- **辅助表及其连接方式:**
- `sync_5110000012939 (b)` → 基于 `ORDER_CODE = FLOW_ID`
- 获取订单编号、员工姓名等基本信息。
- `tache (c)` → 基于 `ORDER_CODE = FLOW_ID`
- 添加任务描述等相关细节。
- `staff (d)` → 基于 `STAFF_ID = person`
- 连接员工表以获取当前负责人名称。
- `codelist (e), codelist (f)` → 分别基于 `code=Change_type` 及 `release_type`
- 映射编码到具体的含义(比如变更类型和发布类型)。
- 子查询 `(g)` → 聚合最大检查时间
```sql
SELECT FLOW_ID, MAX(check_time) AS max_check_time
FROM itsm_change_check
GROUP BY FLOW_ID;
```
- 找到每个流程的最大检查时间。
- 其他 `tache (h, i, j)` 表分别对应不同的模块 ID 条件:
- `h.tch_mod='10016903'`: 完成日期;
- `i.tch_mod='10017802'`: 创建日期;
- `j.tch_mod='1009646'`: 最终完成状态。
#### **2. 自定义字段计算**
```sql
CASE
WHEN a.GEJIE_BEGIN_TIME IS NOT NULL AND j.finish_date IS NOT NULL
THEN DATEDIFF(a.GEJIE_BEGIN_TIME, j.finish_date)
ELSE NULL END AS days_before_notification
```
- 如果某个记录的开始时间和结束时间均有效,则计算它们之间相差天数;若无效则返回空值。
#### **3. WHERE 条件限制**
- 针对某些重要属性设置约束条件,保证只保留满足规则的部分行:
- `c.state='A'`: 当前任务处于活动状态;
- 编码类别匹配:`e.code_type='1004202_Change_type', f.code_type='1086155_release_type_new'`.
---
### **应用场景**
这种复杂的 SQL 查询通常出现在业务系统报表生成或数据分析场景下。其目的在于整合跨多张表格的数据资源,并按照用户需求提炼所需的关键指标。
---
### **优化建议**
为了提升性能,可以考虑以下改进措施:
1. 对频繁使用的外键字段建立索引(如 `FLOW_ID`, `STAFF_ID`, `person`, `CODE` 等)。
2. 将子查询 `(g)` 替换为临时视图或物化视图形式缓存结果。
3. 若可能的话尽量减少不必要的 LEFT JOIN,避免加载冗余数据。
---
阅读全文
相关推荐

















