SQL查询,如何选择下一个值为当前值+1的区间,识别下一个差距并保持其他所有内容不变?

时间:2016-10-08 21:13:34

标签: mysql sql

我正在使用sql querys在java上创建一个程序,我想更新一个id序列,每个id加1,但只在序列间隔中。

假设我有一张这样的表:

  

1 - a | 2 - b | 3 - c | 5 - e | 6 - f

我想将一个ID和子句向前“推”1,但只有当彼此之间的差异仍为1.结果将是这样的:

  

2 - a | 3 - b | 4 - c | 5 - e | 6 - f

我知道可以以编程方式进行,但是有没有办法用SQL查询来做到这一点?如果没有,最好的方法是什么?

提前致谢。

编辑:感谢Thorsten Kettner找到答案,我的查询结果如下:

update pair set id = id + 1 
where id >= 1 
and id < 
(
select min(id)
from (select * from pair) as gap
where gap.id > 1 and not exists
(
  select * 
  from (select * from pair) as oneless
  where oneless.id = gap.id - 1
)
)
order by id desc

2 个答案:

答案 0 :(得分:0)

让我们调用你的表对和两列Key和Value。您的查询将是这样的:

#include <QWidget.h> // inheriting from this class os this include is needed

QT_FORWARD_DECLARE_CLASS(QPushButton) // don't have to include "QPushButton.h" in this header file

class Widget1 : QWidget
{
Q_OBJECT
public:
    Widget1(QWidget* parent = nullptr);

private:
    QPushButton* myButton;
};

PS。我假设你的结果有拼写错误,因为在更新之后,f应该有一个值7。

答案 1 :(得分:0)

如果您知道要关闭的差距(在您的情况下为ID 4),请使用:

update mytable set id = id + 1 where id < 4;

如果您不知道差距在哪里,请找到它:

select min(id) - 1
from mytable
where not exists
(
  select * 
  from mytable oneless
  where oneless.id = mytable.id - 1
);

我们现在可以将这两个语句结合起来进行更新:

update mytable set id = id + 1 
where id <
(
  select min(id) - 1
  from mytable
  where not exists
  (
    select * 
    from mytable oneless
    where oneless.id = mytable.id - 1
  )
);