3

我正在使用 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 文件中,它必须显示每条记录,但这需要很长时间,所以我想这样做的真正原因是分页输出。这个版本的 Informix 没有也Limit没有Skip. 我无法对序列号重新编号,因为处于关系中,这是我们可以在一页上获得固定数量的结果(例如每页 500 个结果)的唯一解决方案。在常规表中已跳过 id(称为 folio),因为它们已被删除。如果我说

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

我可能会在一页中得到 300,然后在下一页中得到 500

4

7 回答 7

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;
于 2011-05-02T18:58:06.930 回答
2

在 Informix 中,当在 INSERT 语句中使用 SELECT 作为子句时,您只能使用 SELECT 语法的一个子集

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

  • 进入温度
  • 订购方式
  • 联盟。

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

于 2008-11-04T20:23:36.260 回答
1

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

INSERT INTO tempTable(id,folio)
SELECT 0, folio 
FROM (
    SELECT folio FROM regularTable ORDER BY folio
);
于 2008-11-04T19:48:02.743 回答
0

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

于 2008-11-04T19:44:24.373 回答
0

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

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

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

于 2008-11-04T21:27:13.510 回答
0

正如比尔所说,对输入进行排序并不重要,您确实需要对输出进行排序。在您提供的简单示例中,这没有任何意义,所以我只能假设您要解决的真正问题更复杂——也许是重复数据删除?

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

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

于 2008-11-05T02:51:12.390 回答
0

像这样的东西会起作用吗?

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

如果表变大或者您要获取以后的“页面”,它可能不是非常有效,但是 10K 行非常小。

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

于 2008-11-05T20:56:51.387 回答