5.2 KiB
5.2 KiB
24H换单率验证SQL修复计划
日期:2026-05-16
问题:汇总统计SQL报错 - ArrivalFormsWithDate 表不存在
目标:找到正确的表名,修复SQL并重新验证
问题诊断
错误信息
1146 - Table 'lr01mainusa.ArrivalFormsWithDate' doesn't exist
原因分析
ArrivalFormsWithDate是在原SQL中创建的CTE(公用表表达式)- 但在汇总验证SQL中,我们可能没有完整包含这个CTE的定义
- 或者表名需要使用其他的到货表
修复方案
方案1:查找正确的到货表名
需要找到以下表之一:
ArrivalForms- 原始到货表arrival_forms- 小写版本- 其他相关的到货表
可以用以下查询查看可用的表:
-- 查找包含"arrival"的表
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND TABLE_NAME LIKE '%arrival%'
ORDER BY TABLE_NAME;
-- 查找包含"form"的表
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND TABLE_NAME LIKE '%form%'
ORDER BY TABLE_NAME;
方案2:查看原始完整SQL中的表名
检查 LabelReplaceRepository.cs 中的完整SQL,看 ArrivalFormsWithDate 是如何定义的。
方案3:修复验证SQL
一旦找到正确的表名,修复SQL的步骤:
-
识别正确的表结构:
- 到货表的名称
- 日期字段名称(到货时间或到货日期)
- 交接单号字段名称(HandoverNumber或其他)
-
调整SQL语句:
- 用实际表名替换
ArrivalFormsWithDate - 调整字段名称和连接条件
- 用实际表名替换
-
测试修复后的SQL:
- 先执行
SELECT子句中的单个子查询进行测试 - 逐步组建完整查询
- 先执行
详细的修复步骤
步骤1:查找正确的表名
执行以下查询来发现数据库中存在的表:
-- 步骤1a:查看所有表
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND TABLE_NAME NOT LIKE 'mysql%'
ORDER BY TABLE_NAME
LIMIT 50;
-- 步骤1b:查看label相关的表
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND TABLE_NAME LIKE '%label%'
ORDER BY TABLE_NAME;
-- 步骤1c:检查原SQL中使用的表
-- 查看 label_replace_requests 表的结构
DESC label_replace_requests;
-- 步骤1d:查看是否有到货表
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND (TABLE_NAME LIKE '%arrival%'
OR TABLE_NAME LIKE '%form%'
OR TABLE_NAME LIKE '%handover%')
ORDER BY TABLE_NAME;
步骤2:根据找到的表名修复SQL
假设找到的表名是 arrival_forms(示例),修复方式如下:
修改前:
FROM ArrivalFormsWithDate a
INNER JOIN label_replace_requests l
ON l.BillOfLadingNumber = a.HandoverNumber
OR l.MasterPackageNumber = a.HandoverNumber
修改后:
FROM arrival_forms a
INNER JOIN label_replace_requests l
ON l.BillOfLadingNumber = a.handover_number
OR l.MasterPackageNumber = a.handover_number
步骤3:确认关键字段
需要确认以下字段在到货表中的实际名称:
- 到货日期/时间字段:
到货时间还是arrival_time还是arrival_date? - 交接单号字段:
HandoverNumber还是handover_number还是其他?
可以用以下查询检查:
-- 查看到货表的字段结构
DESC arrival_forms; -- 或使用实际的表名
-- 或使用标准SQL查询
SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND TABLE_NAME = 'arrival_forms' -- 替换为实际表名
ORDER BY ORDINAL_POSITION;
步骤4:调整日期条件
原SQL使用 DATE(CONVERT_TZ(a.到货时间, '+00:00', '-05:00'))
可能需要调整为:
DATE(a.arrival_time)- 如果字段已经是UTC-5DATE(CONVERT_TZ(a.arrival_time, '+00:00', '-05:00'))- 如果需要时区转换a.arrival_date- 如果已经是日期类型
预期的修复结果
修复完成后,验证SQL应该:
- ✅ 能够成功执行
- ✅ 返回1行结果(单行汇总)
- ✅ 包含所有关键指标:分母、分子详细拆分等
- ✅ 数值合理(分母 > 0,分子 ≤ 分母或接近)
备选方案
如果找不到对应的到货表,可能需要:
-
查询原始SQL中的完整CTE:
- 打开
LabelReplaceRepository.cs - 复制
GetDailyLabelStatsChineseAsync()中完整的CTE定义 - 将完整的WITH...AS...CTE部分合并到验证SQL中
- 打开
-
简化验证SQL:
- 不使用
ArrivalFormsWithDate - 直接从基础表(
label_replace_requests+arrival_forms或其他)重新构建
- 不使用
关键表和字段清单
需要在修复时确认以下信息:
| 元素 | 原始假设 | 实际值 | 确认状态 |
|---|---|---|---|
| 到货表 | ArrivalFormsWithDate | ? | 待查 |
| 到货日期字段 | 到货时间 | ? | 待查 |
| 交接单号字段 | HandoverNumber | ? | 待查 |
| 订单表 | label_replace_requests | label_replace_requests | ✓ |
| 扫描历史表 | label_scan_history | label_scan_history | ✓ |
| 扫描状态表 | OverallScanStatus | ? | 待查 |