【问题标题】:SQL: update a field with a value from the same table, only if condition is metSQL:仅在满足条件时才使用同一表中的值更新字段
【发布时间】:2016-05-27 15:26:40
【问题描述】:

如何将每个产品的流行度(仅当销售额> 1)设置为同一张表中最流行的产品(来自同一品牌)。到目前为止我有这个:

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

显然 'currentRow' 不能存在,因为这样,所以...

我也在调查this answer,但到目前为止还没有运气。

在每一行上iterate/loop 会更好吗,检查条件,并在必要时更新?

【问题讨论】:

  • 如何获得前1名?是按销售额排序的吗?

标签: sql sql-server


【解决方案1】:

你需要的是别名

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

【讨论】:

    【解决方案2】:

    试试这个脚本:

    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
    

    【讨论】:

      【解决方案3】:

      您可以使用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
      

      【讨论】:

        【解决方案4】:

        如果您使用“TOP”,则需要使用 ORDER BY,否则无法保证它会给您带来最受欢迎的。如果您还在寻找最流行的,仅当销售额大于 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-31
          • 2015-09-06
          • 2018-01-22
          • 1970-01-01
          • 2011-05-13
          • 2013-04-05
          • 1970-01-01
          相关资源
          最近更新 更多