2016-05-27 13 views
1

各製品の人気度(売上高> 1)を(同じブランドの)最も人気のある製品のものに設定する方法同じテーブル。SQL:条件が満たされた場合に限り、同じテーブルの値を持つフィールドを更新する

UPDATE Products 
SET popularity= 
    (
    SELECT TOP 1 popularity FROM products 
    WHERE brand = currentRow.brand 
    ) 
WHERE sales > 1 

明らかに「currentRowのは、」このようなことから存在しないので、...

私もthis answerに探していたが、運これまでのところ:私はこれまでのところ、これを持っています。

各行でiterate/loopより良いことがありますか?条件を確認し、必要に応じて更新しますか?

+0

どのようにトップ1を取得しますか?それは売り上げによって並べ替えられていますか? – Aldrin

答えて

3

でこれを行うことができますエイリアスです"TOP"を使用する場合は、ORDER BYを使用する必要があります。そうでなければthそれはあなたに最も人気があることを保証するものではありません。最も人気のあるものを探している場合は、salesが1より大きい場合のみ、サブクエリにWHERE文が必要です。エイリアスを@ Y.Bとして使用する。提案すると、(サブクエリでWHEREを指定してもしなくても)このようなことができます。

UPDATE a 
SET popularity= 
    (
    SELECT TOP 1 b.popularity FROM Products b 
    WHERE b.brand = a.brand 
    AND sales > 1 
    ORDER BY b.popularity DESC 
    ) 
FROM Products a 
WHERE sales > 1 
0

すると、このスクリプトを試してみてください。

UPDATE Tgt 
SET popularity = (
    SELECT Max(popularity) 
    FROM products Ref 
    WHERE Ref.brand = Tgt.brand --< Refer by alias 
) 
FROM Products Tgt --< Give the target table an alias 
WHERE sales > 1 
0

あなたがここに必要なものJOINと派生テーブル

UPDATE P1 
SET P1.Popularity = P2.Popularity 
FROM Products P1 
INNER JOIN (SELECT MAX(Popularity) as [Popularity], Brand 
      FROM  Products P2 
      GROUP BY Brand) P2 on P2.Brand = P1.Brand 
WHERE SALES > 1 
0

場合:

SELECT TOP 1 POPULARITY, BRAND 
INTO #TEMP 
FROM PRODUCTS 
WHERE SALES > 1 

UPDATE PRODUCTS 
SET POPULARITY = B.POPULARITY 
FROM PRODUCTS A, #TEMP B 
WHERE A.BRAND = B.BRAND 
関連する問題