Sql server 执行更新查询后,子查询返回了1个以上的值错误
我正在使用sql server 2012,在更新表时遇到了一个奇怪的问题 我的select查询返回树行,如下所示:Sql server 执行更新查询后,子查询返回了1个以上的值错误,sql-server,Sql Server,我正在使用sql server 2012,在更新表时遇到了一个奇怪的问题 我的select查询返回树行,如下所示: select * from TAble1 p join (select ProductId=max(ProductId) from Table2 s group by s.ProductId) pin on p.id=pin.ProductId where p.categoryid=238 返回的行是: 现在,当我运行此更新查询时: update TA
select * from
TAble1 p join
(select ProductId=max(ProductId) from Table2 s group by s.ProductId) pin on p.id=pin.ProductId
where p.categoryid=238
返回的行是:
现在,当我运行此更新查询时:
update TAble1 set sizing=0 from
TAble1 p join
(select ProductId=max(ProductId) from TAble2 s group by s.ProductId) pin on p.id=pin.ProductId
where p.categoryid=238
我得到了这个错误:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。
声明已终止。
我的查询中的问题在哪里?看起来生成异常的问题在其他地方(例如触发器内部)。
此行可能是更新多行的原因
(select ProductId=max(ProductId) from TAble2 s group by s.ProductId)
如果您想获得max ProductID(单个值),请将其从GROUPBY子句中删除。目前,您正在请求服务器从单个值返回最大值—这是荒谬的。它只返回表2中所有ProductID值的列表。这和
select distinct ProductID from Table2
看起来生成异常的问题在其他地方(例如触发器内部)。
此行可能是更新多行的原因
(select ProductId=max(ProductId) from TAble2 s group by s.ProductId)
如果您想获得max ProductID(单个值),请将其从GROUPBY子句中删除。目前,您正在请求服务器从单个值返回最大值—这是荒谬的。它只返回表2中所有ProductID值的列表。这和
select distinct ProductID from Table2
此
通过s.ProductId从表2 s组中选择ProductId=max(ProductId)
将为您提供不同的ProductId,但不是MAX
。实际上,您的查询将更新所有TAble1.sizing
列。
试试这个:
UPDATE TAble1
SET sizing = 0
FROM TAble1 p
JOIN
(SELECT max(s.ProductId) AS ProductId
FROM TAble2) pin
ON p.id = pin.ProductId AND p.categoryid=238
WHERE p.categoryid = categoryid
此
通过s.ProductId从表2 s组中选择ProductId=max(ProductId)
将为您提供不同的ProductId,但不是MAX
。实际上,您的查询将更新所有TAble1.sizing
列。
试试这个:
UPDATE TAble1
SET sizing = 0
FROM TAble1 p
JOIN
(SELECT max(s.ProductId) AS ProductId
FROM TAble2) pin
ON p.id = pin.ProductId AND p.categoryid=238
WHERE p.categoryid = categoryid
我认为一个更好的问题是什么不是你的问题。在你的选择中,你到底应该加入什么?你要加入什么索引?您正在使用分组依据,但未将分组依据作为列包含在选择中。您不需要在子查询中为“TAble2 s”添加别名。根据您所显示的内容,表p没有categoryid列。在大多数情况下,不应该在UPDATE查询中使用FROM子句,特别是因为您只是将列设置为静态值 但要回答您的问题:子查询:“通过s.ProductId从表2的组中选择ProductId=max(ProductId)”返回所有ProductId行,因此在您尝试加入时失败 既然您没有使用表2中的信息,为什么不简单地更新如下:
update TAble1 set sizing=0 where categoryid=238
我认为一个更好的问题是什么不是你的问题。在你的选择中,你到底应该加入什么?你要加入什么索引?您正在使用分组依据,但未将分组依据作为列包含在选择中。您不需要在子查询中为“TAble2 s”添加别名。根据您所显示的内容,表p没有categoryid列。在大多数情况下,不应该在UPDATE查询中使用FROM子句,特别是因为您只是将列设置为静态值 但要回答您的问题:子查询:“通过s.ProductId从表2的组中选择ProductId=max(ProductId)”返回所有ProductId行,因此在您尝试加入时失败 既然您没有使用表2中的信息,为什么不简单地更新如下:
update TAble1 set sizing=0 where categoryid=238
这是一个触发器。非常感谢。触发器在一次行更新或其他操作后运行?所有更新的行都列在可从触发器访问的插入和删除的临时表中。它是一个触发器。非常感谢。触发器在一行更新或其他操作后运行?所有更新的行都列在可从触发器访问的插入和删除的临时表中