执行更新查询后,子查询返回了多个值错误

时间:2016-02-13 09:40:06

标签: sql-server

我正在使用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

,返回的行是:

enter image description here

现在,当我运行此更新查询时:

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.

我的查询中的问题在哪里?

3 个答案:

答案 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