2016-11-23 37 views
0

と私はサブクエリが1つの以上の値を返し、次のエラーSQL UPDATEステートメントは、集計数

を取得しています。 サブクエリが、=、!<、< =、>、> =、またはサブクエリが式 として使用されている場合は、これは許可されません。このクエリの

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 

私はほんの少し何かが欠けています知っています。助けてくれてありがとう。

+0

ここでサブクエリを見てください。これは、すべてのブランドBrand_IDの数を返していますが、更新の値として使用しようとしています。 –

+0

Seanが言った通り。サブクエリを単独で実行すると、複数のレコードが返されますが、* one *フィールドを設定しようとしています。また、あなたの 'INNER JOIN'は既に' b.Brand_ID = pf2.BrandID'の場合のみに結果セットを限定するべきであるため、あなたの最終的な 'WHERE'が目的を果たしているとは思いません。 – Santi

+0

ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

答えて

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) 

と表示されます。おそらく、サブクエリ内のすべてのレコードの数が必要になるでしょう:グループを取り出してください。

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

これが最適化されていないが、これはあなたのエラーを修正します。