3

Informix (バージョン 7.32) DB を使用しています。1 つの操作で、通常のテーブルの 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 には、LimitnorがありませんSkip。は関係にあるため、シリアル番号を付け直すことはできません。これが、1 ページで一定数の結果を取得できる唯一の解決策です (たとえば、1 ページあたり 500 件の結果)。通常のテーブルでは、ID (フォリオと呼ばれる) は削除されているためスキップされています。私が置くとしたら

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

1 ページで 300 程度、次のページで 500 になるでしょう。

4

7 に答える 7

3

これを行うには、SQL を 2 つの一時テーブルに分割します。

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 では、SELECT を INSERT ステートメントのサブ句として使用する場合、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

ビルが述べたように、入力を注文するポイントはそれほど多くありません。実際に出力を注文する必要があります。あなたが提供した単純な例では、それはまったく意味がないので、あなたが解決しようとしている本当の問題はもっと複雑だと思います-おそらく重複排除?

あなたが求めている機能はですがCREATE SEQUENCE、そのような古いバージョンのInformixでは利用できないと確信しています。

求めていることを本当に実行する必要がある場合UNLOADは、必要な順序でデータを調べてからLOAD、もう一度調べることができます。これにより、SERIAL値が順番に割り当てられるようになります。

于 2008-11-05T02:51:12.390 に答える
0

SELECT ... ORDER BY でカーソルを繰り返し、ループ内で INSERT を実行してみてください。

于 2008-11-04T19:44:24.373 に答える
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 に答える
0

テーブルに挿入するときに行を並べ替えても意味がありません。リレーショナル データベースでは、テーブル内の行の順序を指定できません。

できたとしても、SQL は、挿入した順序など、任意の順序でクエリが行を返すことを保証しません。ORDER BYクエリ結果の順序を保証する句を指定する必要があります。

したがって、行を挿入する順序を変更しても意味がありません。

于 2008-11-04T21:27:13.510 に答える