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

时间:2008-11-04 19:33:32

标签: sql insert informix

我正在使用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?

更新:我想这样做的原因是因为常规表有大约10,000个项目,并且在jsp文件中,它必须显示每条记录,但它需要很长时间,所以我想要这样做的真正原因是 paginate 输出。此版本的Informix没有Limit也没有Skip。我无法对序列重新编号,因为它处于关系中,这是我们可以在一个页面上获得固定数量结果的唯一解决方案(例如,每页500个结果)。在常规表中已跳过id(称为作品集),因为它们已被删除。如果我要把

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

我可能会在一个页面中获得300个,然后在下一页中获得500个

7 个答案:

答案 0 :(得分:3)

您可以通过将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;

答案 1 :(得分:2)

在Informix中使用SELECT作为INSERT语句中的子句时,受限 到SELECT语法的子集

在这种情况下不支持以下SELECT子句:

  • INTO TEMP
  • ORDER BY
  • UNION。

此外,SELECT的FROM子句不能引用INSERT引用的同一个表(在您的情况下这不重要)。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

自从我使用Informix已经有好几年了,但也许这样的事情会起作用:

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

答案 4 :(得分:0)

在插入表格时排序行是没有意义的。关系数据库不允许您指定表中的行顺序。

即使可以,SQL也不保证查询将以任何顺序返回行,例如您插入它们的顺序。您必须指定ORDER BY子句以保证查询结果的顺序。

因此,改变插入行的顺序对你没有好处。

答案 5 :(得分:0)

正如比尔所说,输入的点数并不多,你真的需要订购输出。在您提供的简单示例中,它没有任何意义,所以我只能假设您尝试解决的真正问题更复杂 - 重复数据删除可能吗?

您所使用的功能是CREATE SEQUENCE,但我很确定它在旧版本的Informix中不可用。

如果您确实需要按照要求执行操作,可以按所需顺序查看UNLOAD数据,然后再次LOAD。这将确保顺序分配SERIAL值。

答案 6 :(得分:0)

这样的事情会起作用吗?

SELECT
    folio
FROM
    (
        SELECT
            ROWNUM n,
            folio
        FROM
            regularTable
        ORDER BY 
            folio
    )
WHERE
    n BETWEEN 501 AND 1000

如果表变得更大或者你后来获取“页面”,它可能不是非常有效,但是10K行非常小。

我不记得Informix是否有ROWNUM概念,我使用的是Oracle。