T-SQL查询报错子查询返回多值,寻求问题排查修复方案
报错根因
- Msg 512错误:SELECT列表中用于计算
ST01_Approved_Date的标量子查询返回了多行结果。标量子查询作为单列表达式使用时,只允许返回1行1列的结果,你的代码中该子查询用GROUP BY w.WorkflowID, w.CustomerID做聚合,当同一个CustomerID存在多条符合筛选条件的Workflow记录时,就会返回多行触发报错。 - 空值消除警告:代码中使用的
SUM、MAX等聚合函数会自动忽略NULL值,属于SQL默认行为,不会影响查询执行,只是提示有NULL值被聚合操作跳过。
修复方案
1. 解决Msg 512报错
修改ST01_Approved_Date的子查询逻辑,去掉不需要的GROUP BY w.WorkflowID,直接按CustomerID维度取最小日期即可,修改后的代码如下:
(SELECT MIN(wh.MGCReviewerModifiedDate) AS [ST01_Approved_Date] FROM ABC.dbo.tblWorkflow w INNER JOIN ABC.dbo.tblWorkflowHistory wh ON w.WorkflowID = wh.WorkflowID WHERE wh.WorkflowQueueID = 4 AND wh.MGCReviewerModifiedDate IS NOT NULL AND wh.Deleted IS NULL AND w.WorkflowOutcomeID = 1 AND w.WorkflowQueueID = 4 AND w.Deleted IS NULL AND w.CustomerID = c.CustomerID) AS ST01_Approved_Date,
如果业务要求需要保留按WorkflowID聚合的逻辑,也可以在外层再加一次MIN聚合,或者给子查询加TOP 1按日期排序取最早的一条。
2. 消除空值警告(可选)
如果不需要该警告提示,可以在查询最开头添加关闭ANSI警告的语句:
SET ANSI_WARNINGS OFF;
执行查询后如果需要恢复默认警告规则,可在查询末尾添加:
SET ANSI_WARNINGS ON;
内容的提问来源于stack exchange,提问作者Rookie
相关产品推荐
相关产品推荐

