如何在Informix表

时间:2016-08-03 08:41:40

标签: sql database informix

如何找到第一个"差距"在Informix`table中的自动增量列中。

例如:

我的表格mission是这样的:

emp_num  serial_request  year_request
33         45            2012
667        46            2012
588        50            2012
78         53            2012
89         33            2013

我希望2012中的第一个差距----> 47

我搜索过并发现了以下问题:

How do I find a “gap” in running counter with SQL?  但答案并不涵盖Informix。

1 个答案:

答案 0 :(得分:1)

其他问题的选定答案只需要进行简单的修改即可使用Informix。

例如,other question中给出的一个解决方案是:

SELECT  id + 1
FROM    mytable mo
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    mytable mi 
        WHERE   mi.id = mo.id + 1
        )
ORDER BY
        id
LIMIT 1

适用于您的架构的Informix等效项是:

SELECT LIMIT 1 serial_request + 1 AS id
  FROM mission AS m1
 WHERE NOT EXISTS
       (SELECT *
          FROM mission AS m2 
         WHERE m2.serial_request = m1.serial_request + 1
       )
 ORDER BY id

给定样本数据,它正确地产生答案34(在表格中出现的数字后丢失的第一个数字)。要在2012年输入一行后丢失第一个数字,您只需添加一个条件:

   AND m1.year_request = 2012

导致:

SELECT LIMIT 1 serial_request + 1 AS id
  FROM mission AS m1
 WHERE NOT EXISTS
       (SELECT *
          FROM mission AS m2 
         WHERE m2.serial_request = m1.serial_request + 1
       )
   AND m1.year_request = 2012
 ORDER BY id

根据要求确实产生答案47

您还可以使用OLAP窗口函数解决方案(同样,基于其他问题的SQL):

SELECT LIMIT 1
       q.previd + 1
  FROM (SELECT serial_request,
               LAG(serial_request) OVER (ORDER BY serial_request) previd
          FROM mission
         WHERE year_request = 2012
       ) AS q
 WHERE q.previd <> q.serial_request - 1
 ORDER BY q.previd;

这也是47。我们可以讨论代码中加号和减号1的相对优点以及它们应该去的位置。

测试架构和数据

DROP TABLE IF EXISTS mission;

CREATE TEMP TABLE mission
(
    emp_num         INTEGER NOT NULL PRIMARY KEY,
    serial_request  SERIAL NOT NULL UNIQUE,
    year_request    SMALLINT NOT NULL
);

INSERT INTO mission(emp_num, serial_request, year_request) VALUES(33, 45, 2012);
INSERT INTO mission(emp_num, serial_request, year_request) VALUES(667, 46, 2012);
INSERT INTO mission(emp_num, serial_request, year_request) VALUES(588, 50, 2012);
INSERT INTO mission(emp_num, serial_request, year_request) VALUES(78, 53, 2012);
INSERT INTO mission(emp_num, serial_request, year_request) VALUES(89, 33, 2013);

测试:在Mac OS X 10.11.6上运行的Informix 12.10.FC5。