如何根据某些条件插入或更新?

Posted

技术标签:

【中文标题】如何根据某些条件插入或更新?【英文标题】:How to insert or update based on some condition? 【发布时间】:2013-03-31 04:48:15 【问题描述】:

有人可以帮我解决这个问题吗!我有 2 张桌子:

1.具有自定义日期相关定价窗口的现有定价表:

  id | prod id |   start    |    stop    |   price  
-----+---------+------------+------------+-----------
   1 |   65210 | 2012-01-01 | 2013-01-01 |  5.00     
   2 |   54841 | 2012-02-05 | 2013-03-01 | 15.00     
   3 |   51518 | 2012-01-01 | 2013-01-01 |  5.00     
   4 |    8402 | 2012-01-01 | 2017-01-01 |  5.00     
   5 |    1520 | 2012-01-01 | 2050-01-01 | 12.00     
   6 |     959 | 2013-10-01 | 2018-01-01 |  5.00  

2.“新”定价数据表(用于更新上面每个唯一prod id的表):

 prod id |   start    |    stop    |   price   
  -------+------------+------------+-----------
   65210 | 2013-01-01 | 2025-01-01 |  5.00     
   54841 | 2013-02-05 | 2017-03-01 | 15.00     
     959 | 2013-01-01 | 2017-01-01 |  5.00    

假设它仍然“在窗口中”,用表 2 中的 stop 日期更新表 1 中的 stop 日期的最佳方法是什么?如果现有的stop 日期早于“新”start 日期,则会使用新的startstop 日期创建新的定价记录。

谢谢!

【问题讨论】:

欢迎堆栈溢出。请展示您迄今为止尝试过的内容,以及无效的内容。否则您的问题可能会被关闭,因为这不是“为我做”网站。 另外,它有助于包含您正在使用的 SQL 平台。我猜它是 mysql,但您应该将平台包含为标签 并考虑提供一个带有所需结果集的 sqlfiddle 【参考方案1】:

...用表 2 中的 stop 日期更新表 1 中的 stop 日期,假设它仍然“在窗口中”...

UPDATE price p JOIN new_price n
    ON p.prod_id = n.prod_id
   AND n.start BETWEEN p.start AND p.stop
   SET p.stop = n.stop

插入一条新记录“...如果现有的stop 日期早于新的start 日期...”

INSERT INTO price (`prod_id`, `start`, `stop`, `price`)
SELECT n.prod_id, n.start, n.stop, n.price
  FROM new_price n JOIN price p
    ON n.prod_id = p.prod_id
   AND n.start > p.stop

这里是SQLFiddle演示

【讨论】:

以上是关于如何根据某些条件插入或更新?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas 或 Python 中根据某些条件放置项目?

如何根据 Oracle SQL 中的某些条件将列拆分为 2?

根据特定条件从表中获取已插入数据的插入查询

T-SQL:在 UPDATE 语句中使用 CASE 根据条件更新某些列

如何在android数据库中显示表创建日期以及如何根据日期的某些条件删除该表?

使用 Laravel 同步或更新 ExistingPivot -- 如何根据第三个条件进行填充