我正在使用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个
答案 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子句:
此外,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。