我陷入了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
---------------------------------------------
有人可以帮我吗? 预先感谢。
答案 0 :(得分:0)
您可以使用where子句来进行更新。我不明白您的意思,并且start_date是相同的,但是end_date是不同的,所以我没有使用它。
UPDATE table1
SET status='SUSPEND'
WHERE status='FAILED' and end_date<start_date
答案 1 :(得分:0)
end_date
获得start_date
的最小值。start_date
和min_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'