我正在使用sql-server 2012,我在更新表时遇到了一个奇怪的问题。
我的选择查询返回树行,如下所示:
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.
我的查询中的问题在哪里?
答案 0 :(得分:2)
看起来产生异常的问题在其他地方(例如在触发器内)。
此行可能是更新多行的原因
Location databaseLocation = new Location("databaseLocation");
databaseLocation.setLatitude(database_latitude);
databaseLocation.setLongitude(database_longitude);
//< 3000 meters = 3km
if (currentLocation.distanceTo(databaseLocation) < 3000) {
//**This entry is within limits**
}
如果要获取最大ProductID(单个值) - 将其从GROUP BY子句中删除。目前,您正在请求服务器从单个值返回最大值 - 这是荒谬的。它只返回Table2中所有ProductID值的列表。与
相同(select ProductId=max(ProductId) from TAble2 s group by s.ProductId)
答案 1 :(得分:0)
这select ProductId=max(ProductId) from Table2 s group by s.ProductId
会给你DISTINCT ProductId,但不是MAX
。并且您没有与TAble1的链接实际上您的查询将更新所有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
答案 2 :(得分:0)
我认为更好的问题是查询中的问题是什么。在您的SELECT中,您应该加入什么?你加入它的指数是什么?您正在使用GROUP BY但不包括GROUP BY作为SELECT中的列。你不需要为TAble2&#39;提供别名。在子查询中。根据您所显示的内容,TAble p没有类别列。在大多数情况下,您不应该在UPDATE查询中使用FROM子句,尤其是因为您只是将列设置为静态值。
但要回答你的问题:子查询:&#34;通过s.ProductId&#34;从TAble2 s group中选择ProductId = max(ProductId)。返回所有ProductId行,因此当您尝试加入时它会失败。
由于您未使用Table2中的信息,为什么不只是像这样更新:
update TAble1 set sizing=0 where categoryid=238