You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决SQL错误Msg 512, Level 16, State 1, Line 78?

解决Msg 512错误并获取1月10日下单的客户姓名

错误原因

Msg 512的核心问题是:你用=运算符匹配子查询结果,但子查询返回了多行数据,而=只支持单个值的匹配,因此触发了这个错误。你的子查询会返回所有1月10日的订单日期(可能包含不同年份的1月10日,或者同一天的多条订单记录),显然不是单个值。

最优解决方案

直接在主查询的WHERE子句中过滤日期,完全不需要子查询,代码更简洁高效:

select CustomerName, OrderDate
from [Sales].Customers
join Sales.Orders
on Sales.Orders.CustomerID = Sales.Customers.CustomerID
where MONTH(OrderDate) = 1 
  and DAY(OrderDate) = 10

如果需要限定具体年份(比如只查2023年的1月10日),推荐用范围查询,这样可以利用OrderDate字段的索引,性能更好:

select CustomerName, OrderDate
from [Sales].Customers
join Sales.Orders
on Sales.Orders.CustomerID = Sales.Customers.CustomerID
where OrderDate >= '2023-01-10' 
  and OrderDate < '2023-01-11'

保留子查询的修复方式

如果一定要用子查询结构,把=换成IN(IN支持匹配多行结果):

select CustomerName, OrderDate
from [Sales].Customers
join Sales.Orders
on Sales.Orders.CustomerID = Sales.Customers.CustomerID
where OrderDate IN (select OrderDate
                   from Sales.Orders
                   where Month(OrderDate) = 1
                   and DATEPART(DAY, OrderDate) = 10)

不过这种写法冗余,因为子查询的过滤条件和主查询要实现的逻辑完全一致,没必要多此一举。

内容的提问来源于stack exchange,提问作者Amritpal Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:39:53