具有聚合计数的SQL Update语句

时间:2016-11-23 19:51:25

标签: sql-server

我收到以下错误

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   表达。

对于此查询:

UPDATE b 
SET b.Products = (SELECT COUNT(pf.Product_Family_ID) 
                  FROM Product_Families pf
                  INNER JOIN Products p ON pf.Product_Family_ID = p.Product_Family_ID
                  INNER JOIN Brands b2 on pf.BrandID = b2.Brand_ID
                  WHERE 
                      pf.Discontinued = 0 
                      AND pf.Live = 0 
                      AND p.Inventory > 0
                      AND pf.Brand <> ''
                  GROUP BY 
                      b2.Brand, b2.Brand_ID) 
FROM Brands b
INNER JOIN Product_Families pf2 ON b.Brand_ID = pf2.BrandID
WHERE
    b.Brand_ID = pf2.BrandID

我知道我只缺少一些东西。谢谢你的帮助。

3 个答案:

答案 0 :(得分:0)

您无法为标量值指定非标量值。您的子查询可能会返回一组元组,因为您要求每个组都有COUNT。单独运行子查询:

(Select COUNT(pf.Product_Family_ID) 
   FROM Product_Families pf
   INNER JOIN Products p ON pf.Product_Family_ID = p.Product_Family_ID
   INNER JOIN Brands b2 on pf.BrandID = b2.Brand_ID
   WHERE 
      pf.Discontinued = 0 
      AND 
      pf.Live = 0 
      AND 
      p.Inventory > 0
      AND 
      pf.Brand <> ''
    GROUP BY b2.Brand, b2.Brand_ID) 

你会看到它返回的内容。您可能需要计算子查询中的所有记录:取出分组。

答案 1 :(得分:0)

感谢您的帮助,这是我使用的解决方案。

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
  /*Then it exists*/
  DROP TABLE #Temp

SELECT * INTO #Temp FROM (SELECT 
    b.Brand_ID, 
    b.Brand, 
    COUNT(pf.Product_Family_ID) PFBrandCount FROM Product_Families pf 
INNER JOIN Products p ON pf.Product_Family_ID = p.Product_Family_ID
INNER JOIN Brands b on pf.BrandID = b.Brand_ID
WHERE 
    pf.Discontinued = 0 
AND 
    pf.Live = 0 
AND 
    p.Inventory > 0
AND 
    pf.Brand <> ''
Group BY b.Brand, b.Brand_ID) data

Update b SET Products = #Temp.PFBrandCount
FROM BRANDS b
INNER JOIN #Temp ON b.Brand_ID = #Temp.Brand_ID       


DROP TABLE #Temp

答案 2 :(得分:0)

正如@nicomp所说,您的子查询将返回多个结果,因此只需将结果过滤到特定品牌。

试试这个:

UPDATE b 
SET b.Products = Select number (SELECT COUNT(pf.Product_Family_ID) as number, b2.Brand_ID
                  FROM Product_Families pf
                  INNER JOIN Products p ON pf.Product_Family_ID = p.Product_Family_ID
                  INNER JOIN Brands b2 on pf.BrandID = b2.Brand_ID
                  WHERE 
                      pf.Discontinued = 0 
                      AND pf.Live = 0 
                      AND p.Inventory > 0
                      AND pf.Brand <> ''
                  GROUP BY 
                      b2.Brand, b2.Brand_ID) 
                  Where Brand_ID = b.Brand_ID
FROM Brands b
INNER JOIN Product_Families pf2 ON b.Brand_ID = pf2.BrandID
WHERE
    b.Brand_ID = pf2.BrandID

这未经过优化,但这可以解决您的错误。