【问题标题】:Conditional Update on patition请愿书的有条件更新
【发布时间】:2013-10-12 23:53:27
【问题描述】:

我需要使用以下逻辑更新表:查找过滤字段 = '某个值'的行,让我们称之为“选定行”,然后更新“选定行”本身以及订单字段所在的行> 所选行顺序字段:

例如,我想增加所有具有“选定行”价格值和相同 id_product 的价格值的价格行,其中“选定行”的距离值 = 到 7 所以选定行是 *,已更新的行应该是^

我的表 编号 |价格 | id_product |距离 1 | 10 | 1 | 1 2 | 04 | 1 | 2 3 | 02 | 1 | 12 4 | 44 | 1 | 2 ^ 5 | 09 | 1 | 1 6 | 13 | 1 | 7 * ^ 7 | 15 | 1 | 8 ^ 8 | 09 | 2 | 5 9 | 12 | 2 | 8 10 | 17 | 2 | 1 11 | 32 | 2 | 13 12 | 22 | 2 | 2

数据库是 postgres 9.2。

谢谢

这是我的错,

set price = x.price + 2 
错误,更新为
set price = tbla.price + 2

以这种方式调整过滤器:

((tbla.price > x.price) OR (x.id = tbla.id AND tbla.price = x.price)) AND x.id_product = tbla.id_product

查询现在有效:

更新 mytable tbla 设置价格 = tbla.price + 2 从 ( SELECT price, id, id_product FROM mytable WHERE distance = 7) x WHERE ((tbla.price > x.price) OR (x.id = tbla.id AND tbla.price = x.price)) AND x.id_product = tbla.id_product

谢谢

【问题讨论】:

  • 你已经尝试过什么?它应该是一个简单的SELECT 和一个sub-query
  • 试过这个更新 mytable tbla set price = x.price + 2 FROM ( SELECT price, id, id_product FROM mytable WHERE distance = 7) x WHERE (x.id = tbla.id OR tbla.price > x.price) AND x.id_product = tbla.id_product 它不起作用,因为“选定的行”没有得到更新。如果我使用 >= 运算符,它会被更新并且所有行都具有相同的价格,这是不需要的
  • 能否将您的查询发布到您的帖子中并设置格式?
  • 可能是我说得太简单了。
  • @PM77-1:很简单,OP 只需要整合 SQL 操作集合的事实,而不是巨型数组的元素(正如他当前的查询所做的那样)。 OP:这里不需要子查询;查找更新语法,并将表与自身连接。

标签: sql postgresql


【解决方案1】:

首先尝试发现一个 SELECT 查询来检索应该更新的行,例如:

SELECT *
FROM mytable m
JOIN mytable m1
ON m.id_product = m1.id_product
   AND m.price >= m1.price
   AND m1.distance = 7
;

然后更新此查询返回的行:

UPDATE mytable SET price = price + 2
WHERE id IN (
   SELECT m.id
   FROM mytable m
   JOIN mytable m1
   ON m.id_product = m1.id_product
      AND m.price >= m1.price
      AND m1.distance = 7
);

一个演示 --> http://www.sqlfiddle.com/#!12/f5d59/4

为了清楚起见,演示中的查询更新了一个额外的列new_price,而不是price

UPDATE mytable SET new_price = price + 2 .....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多