【问题标题】:SQL set column with derived value具有派生值的 SQL 集列
【发布时间】:2019-05-29 13:06:36
【问题描述】:

如何将列值设置为“1”,其中 sum(price) >= 88

例如:如果客户 A 的 sum(price) 大于或等于 88,则交货将更新为“Y”

客户表:名称、价格、交货(我只列出了重要的列)

我的 SQL 查询:

UPDATE  customer
SET delivery ='Y'
WHERE (SELECT SUM(price) FROM customer
GROUP BY name )>=88;

错误:您不能在 FROM 子句中指定目标表“客户”进行更新

见附表:

【问题讨论】:

  • 大多数数据库不允许你UPDATE从你正在更新的同一个表中选择数据。
  • 请添加示例数据和预期结果。几行将有助于我们了解您的问题。
  • (SELECT SUM(price) FROM customer GROUP BY name ) 很可能会返回超过 1 行,那么您要应用什么条件?
  • 添加了一张我桌子的照片。不知道如何构造它以使其在 stackoverflow 中看起来更好,所以我拍了一张快照。原谅我。

标签: sql database sql-update


【解决方案1】:

您正在更新的表和您的子选择之间没有任何连接。你的桌子并没有真正的钥匙,但鉴于你所展示的,我会这样做:

update Orders
set delivery = 'Y'
where Name in (SELECT NAME FROM 
    (SELECT NAME, SUM(PRICE) TOTAL_PRICE
    FROM ORDERS 
    GROUP BY NAME
    HAVING SUM(PRICE)> 88) A
    ) 

所以基本上它会获取每个客户的名称和总和或他们的订单价格,但仅在总和超过 88 的情况下。然后它只是从该子选择中提取名称并仅更新列表中存在名称的行总和超过 88 个订单的名称。

【讨论】:

    【解决方案2】:

    将列设置为您从表中选择的值,不要将它们分组。
    SET COLUMN_X = (SELECT SUM(price) FROM customer)

    现在你使用你的查询,它看起来更干净

    UPDATE  customer
    SET delivery ='Y'
    WHERE COLUMN_X = >=88;
    

    【讨论】:

      【解决方案3】:

      你没有说你正在使用哪个数据库(或者它的哪个版本),所以你可以试试这个标准 SQL是否适用于它:

      with
      x as (
        select name
        from customer
        group by name
        having sum(price) > 88
      )
      update customer c
      set delivery = 'Y'
      where name in (select name from x)
      

      【讨论】:

        【解决方案4】:

        基本上与@TheImpaler 刚刚发布的内容相同,但使用子查询而不是CTE。

        首先获取符合条件的名称,然后加入该列表以获取 UPDATE 语句。

        UPDATE t
          SET delivery = 'Y'
        FROM
          #t AS t
        JOIN
          (
            SELECT
              name
             ,SUM(price) AS total
            FROM
              #t
            GROUP BY
              name
            HAVING
              SUM(price) >= 88
          ) AS d
            ON
            d.name = t.name;
        

        这是一个正常工作的 Rextester:https://rextester.com/LQWE88535

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-12
          • 2020-02-06
          • 2019-05-03
          • 2019-08-31
          相关资源
          最近更新 更多