質問

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に挿入する方法はありますか?

UPDATE:これを行う理由は、通常のテーブルに約10,000個のアイテムがあり、jspファイルではすべてのレコードを表示する必要があるためですが、時間がかかるため、これを行う本当の理由は出力をページ分割することです。このバージョンのInformixには、 Limit Skip もありません。リレーションシップにあるため、シリアル番号を付け直すことはできません。これは、1ページで一定数の結果(たとえば、ページごとに500件の結果)を取得できる唯一のソリューションです。通常の表では、IDが削除されているため(Folioと呼ばれる)IDがスキップされています。私が置いた場合

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

1ページで約300、次のページで500を取得します

役に立ちましたか?

解決

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

他のヒント

これを行うには、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;

Informixでは、INSERTステートメントの副節としてSELECTを使用する場合、制限があります SELECT構文のサブセット

この場合、次のSELECT句はサポートされていません。

  • INTO TEMP
  • ORDER BY
  • UNION。

さらに、SELECTのFROM句は、INSERTによって参照されるのと同じテーブルを参照できません(これはあなたのケースでは重要ではありません)。

Informixに取り組んでから数年が経ちましたが、おそらく次のように機能します。

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

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

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

したがって、行を挿入する順序を変更することは役に立ちません。

Billが述べたように、入力を順序付けるポイントはそれほど多くないので、出力を順序付ける必要があります。あなたが提供した単純な例では、それは意味をなさないので、あなたが解決しようとしている本当の問題はより複雑であるとしか推測できません-おそらく重複排除?

後の機能は CREATE SEQUENCE ですが、そのような古いバージョンのInformixでは使用できないと確信しています。

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

このようなものは機能しますか?

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

テーブルが大きくなるか、後で「ページ」をフェッチする場合、ひどく効率的ではないかもしれませんが、1万行はかなり小さいです。

InformixにROWNUMの概念があるかどうかは思い出せませんが、Oracleを使用しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top