一時的な値に挿入(select… idによる順序)
質問
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を使用しています。