如何解决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
相关产品推荐
相关产品推荐

