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