插入临时值(选择....按ID排序)

xporro 发布于 2018-05-20 informix 最后更新 2018-05-20 13:25 91 浏览

我正在使用Informix(版本7.32)数据库。在一个操作中,我使用常规表和串行列的ID创建一个临时表(因此我会将常规表中的所有ID连续编号)。但我想从常规表中按ID排序来插入信息,例如:

CREATE TEMP TABLE tempTable (id serial, folio int );
INSERT INTO tempTable(id,folio)
SELECT 0,folio FROM regularTable ORDER BY folio;
但是这会产生一个语法错误(因为ORDER BY) 有没有什么方法可以将信息排序然后将其插入tempTable? 更新:我想这样做的原因是因为常规表有大约10000个项目,并且在一个jsp文件中,它必须显示每条记录,但这需要很长时间,所以我想要这样做的真正原因是分页输出。此版本的Informix没有LimitSkip。我不能对系列重新编号,因为它们存在关系,这是我们在一个页面上获得固定数量结果的唯一解决方案(例如每页500个结果)。在Regular表中跳过了id(称为folio),因为它们已被删除。如果我要放
SELECT * FROM regularTable WHERE folio BETWEEN X AND Y
我会在一页中获得300份,然后在下一页中获得500份
已邀请:

jfugit

赞同来自:

您可以尝试在SELECT ... ORDER BY上迭代游标并在循环中执行INSERT。

somnis

赞同来自:

自从我开始使用Informix以来,这已经有好几年了,但也许会有这样的情况发生:

INSERT INTO tempTable(id,folio)
SELECT 0, folio 
FROM (
    SELECT folio FROM regularTable ORDER BY folio
);

iullam

赞同来自:

在使用SELECT作为INSERT语句中的子语句时,Informix是有限的 到SELECT语法的一个子集。 以下SELECT子句在这种情况下不受支持:

  • 输入TEMP
  • ORDER BY
  • UNION。 另外,SELECT的FROM子句不能引用INSERT引用的同一个表(不是你的情况那么重要)。

jquia

赞同来自:

在插入表格时排序行是没有意义的。关系数据库不允许您指定表中行的顺序。 即使可以,SQL也不保证查询将以任何顺序返回行,例如您插入它们的顺序。您必须指定ORDER BY子句以保证查询结果的顺序。 所以它会改变你插入行的顺序并不好。

ket

赞同来自:

正如比尔所说的那样,没有很多点排序输入,你真的需要排序输出。在你提供的简单例子中,它没有任何意义,所以我只能假设你试图解决的真正问题更复杂 - 也许是重复数据删除? 您所追求的功能是CREATE SEQUENCE,但我确信它在这种旧版本的Informix中不可用。 如果您确实需要按照您要求的方式进行操作,则可以按照所需顺序查看UNLOAD数据,然后再次LOAD。这将确保SERIAL值顺序分配。

somnis

赞同来自:

会有这样的工作吗?

SELECT
    folio
FROM
    (
        SELECT
            ROWNUM n,
            folio
        FROM
            regularTable
        ORDER BY 
            folio
    )
WHERE
    n BETWEEN 501 AND 1000
如果表格变大或者您稍后抓取“页面”,这可能不是非常有效,但10K行非常小。 我不记得Informix是否有ROWNUM概念,我使用Oracle。

ueaque

赞同来自:

您可以通过将SQL分解为两个临时表来完成此操作:

CREATE TEMP TABLE tempTable1 (
id serial,
folio int);
SELECT folio FROM regularTable ORDER BY folio
INTO TEMP tempTable2;
INSERT INTO tempTable1(id,folio) SELECT 0,folio FROM tempTable2;