根据其他列的过滤器更新SQL列?

时间:2018-10-11 10:24:14

标签: mysql sql oracle

我陷入了SQL查询。我想使用sql查询更新STATUS列。 确切的要求是我有一个如下的SQL表。

_____________________________________________
start_date          end_date        status
---------------------------------------------
2014/01/03      |   2018/01/03  |   FAILED
2016/12/15      |   2017/01/03  |   SUCCESS
2014/01/03      |   2010/01/13  |   FAILED
2017/10/23      |   2017/01/03  |   FAILED
2014/01/03      |   2011/01/03  |   FAILED
2017/11/13      |   2017/01/03  |   SUCCESS
---------------------------------------------

在上表中,我有开始日期,结束日期和状态。 现在,我想将状态从“ FAILED”更新为“ SUSPEND”,其中end_date是所有日期中最早的一个,并且start_date相同,但是end_date不同。 (此处仅更新一行,如下表所示)

我正在尝试建立查询,但无法获取所需的结果。 应用正确的查询后,该表应如下所示。


start_date          end_date        status
---------------------------------------------
2014/01/03      |   2018/01/03  |   FAILED
2016/12/15      |   2017/01/03  |   SUCCESS
2014/01/03      |   2010/01/13  |   SUSPEND
2017/10/23      |   2017/01/03  |   FAILED
2014/01/03      |   2011/01/03  |   FAILED
2017/11/13      |   2017/01/03  |   SUCCESS
---------------------------------------------

有人可以帮我吗? 预先感谢。

3 个答案:

答案 0 :(得分:0)

您可以使用where子句来进行更新。我不明白您的意思,并且start_date是相同的,但是end_date是不同的,所以我没有使用它。

UPDATE table1
SET status='SUSPEND'
WHERE status='FAILED' and end_date<start_date

答案 1 :(得分:0)

  • Derived Table中,为一组end_date获得start_date的最小值。
  • 根据start_datemin_end_date将其加入主表。
  • 相应地更新status

在MySQL( DB Fiddle )中尝试以下操作:

UPDATE your_table AS t1
JOIN (SELECT start_date, 
             MIN(end_date) AS min_end_date 
      FROM your_table 
      GROUP BY start_date) AS t2 ON t2.start_date = t1.start_date AND 
                                    t2.min_end_date = t1.end_date 
SET t1.status = 'SUSPEND' 
WHERE t1.status = 'FAILED'

答案 2 :(得分:0)

Madhur所讲的逻辑是正确的,只是功能上的错误。由于您要求的是最旧的,所以我们应该使用MIN而不是MAX进行查询

UPDATE your_table AS t1
JOIN (SELECT start_date, 
             MIN(end_date) AS max_end_date 
     FROM your_table 
     GROUP BY start_date) AS t2 ON t2.start_date = t1.start_date AND 
                                    t2.max_end_date = t1.end_date  
SET t1.status = 'SUSPEND' 
WHERE t1.status = 'FAILED'