我使用的一个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;

但是,这创造了一语法错误(因为为了通过)

是否有任何种方式我可以订购的信息,然后插到,应升级授权表,使之?

更新:因为我想这样做是因为经常表具有约10,000个项目,并在jsp文件,它已经显示每条记录,但这将需要长,因此,真正的原因我想要做这个是为了 输出。这个版本的Informix没有 Limit 也不 Skip.我不能重新编号序列,因为是在一个关系中,这是唯一的解决方案我们可以获得一个固定数量的结果在一个页面(例如500结果每页)。在经常表已经跳过id's(称为页),因为它们已经被删除。如果我们把

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

我会得到300也许在一个页面上,然后500在下一页

有帮助吗?

解决方案

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

其他提示

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

在Informix当使用选择作为一个子句中插入的发言,你是 限 一个子集的选择的语法.

以下选择条款不支持在这种情况下:

  • 成TEMP
  • 为了通过
  • 联盟。

此外,从条款的选择不可以参考同一表所引用的插入(未就这一事项在你的情况)。

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

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

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

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

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

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

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

如果你真的需要做你要求的事情,你可以按照所需的顺序查看 UNLOAD 数据,然后再次 LOAD 。这将确保顺序分配SERIAL值。

这样的事情会起作用吗?

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

如果表格变大或者你稍后取“页面”,它可能效率不高,但10K行非常小。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top