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

Posted

技术标签:

【中文标题】插入临时值(选择....按id排序)【英文标题】:Insert into temp values (select.... order by id) 【发布时间】:2008-11-04 19:33:32 【问题描述】:

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

【问题讨论】:

实际上没有任何 Informix DBMS 的 7.4 版本(当然不是主流的——像 Redbrick 这样的怪人,在 IBM 收购 Informix 之前不久被 Informix 收购,可能有这样的版本号)。跨度> 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

进入温度 订购人 联合。

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

这样做的缺点是它涉及从服务器到应用程序的往返以获取和插入每一行。然而,它是有效的方式。【参考方案5】:

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

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

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

【讨论】:

【参考方案6】:

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

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

如果您确实需要按照您的要求进行操作,您可以按要求的顺序查看UNLOADing 数据,然后再次LOADing 它。这将确保 SERIAL 值按顺序分配。

【讨论】:

【参考方案7】:

这样的东西有用吗?

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

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

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

【讨论】:

有rowid...也许是一样的

以上是关于插入临时值(选择....按id排序)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 中临时表的替代方案

如何使用 jdbc oracle 插入和选择全局临时表? [复制]

SQL Server 存储过程创建临时表并插入值

在 oracle 临时表中插入 1000 多个长数字

如何在临时表中添加Null Value记录?

如何插入配置单元表,按从临时表读取的日期进行分区? [复制]