Question

J'utilise une base de données Informix (version 7.32). Lors d’une opération, je crée une table temporaire avec l’ID d’une table standard et d’une colonne série (afin que tous les ID de la table standard soient numérotés de manière continue). Mais je veux insérer les informations de la table standard classées par ID, par exemple:

CREATE TEMP TABLE tempTable (id serial, folio int );

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

Mais cela crée une erreur de syntaxe (à cause de ORDER BY)

Existe-t-il un moyen de commander les informations puis de les insérer dans la table tempTable?

UPDATE: La raison pour laquelle je veux faire cela est parce que la table standard contient environ 10 000 éléments et dans un fichier jsp, elle doit afficher chaque enregistrement, mais cela prendrait trop de temps, donc la vraie raison pour laquelle je veux le faire est de paginer la sortie. Cette version d'Informix ne contient ni Limit , ni Ignorer . Je ne peux pas renuméroter le numéro de série car il s'agit d'une relation et c'est la seule solution permettant d'obtenir un nombre fixe de résultats sur une page (par exemple 500 résultats par page). Dans la table Normal, les identifiants (appelés folio) ont été ignorés car ils ont été supprimés. si je devais mettre

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

J'aurais peut-être 300 pages sur une page, puis 500 pages suivantes

Était-ce utile?

La solution

Vous pouvez essayer de réitérer un curseur sur SELECT ... ORDER BY et de faire des INSERT dans la boucle.

Autres conseils

Pour ce faire, divisez le code SQL en deux tables temporaires:

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;

Dans Informix, lorsque vous utilisez un SELECT en tant que sous-clause dans une instruction INSERT, vous êtes limité un sous-ensemble de la syntaxe SELECT .

Les clauses SELECT suivantes ne sont pas prises en charge dans ce cas:

  • INTO TEMP
  • ORDER BY
  • UNION.

De plus, la clause FROM de SELECT ne peut pas référencer la même table que celle référencée par INSERT (même si cela compte dans votre cas).

Cela fait des années que je travaille sur Informix, mais peut-être que quelque chose comme cela fonctionnera:

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

Cela n'a aucun sens de classer les lignes lorsque vous les insérez dans un tableau. Les bases de données relationnelles ne vous permettent pas de spécifier l'ordre des lignes dans une table.

Même si vous le pouviez, SQL ne garantit pas qu'une requête renverra des lignes dans un ordre quelconque, tel que l'ordre dans lequel vous les avez insérées. Vous devez spécifier une clause ORDER BY pour garantir la commande d'un résultat de requête.

Cela ne vous aiderait donc pas de changer l'ordre dans lequel vous insérez les lignes.

Comme Bill l’a déclaré, il n’ya pas de raison d’ordonner l’entrée, vous avez vraiment besoin d’ordonner la sortie. Dans l’exemple simpliste que vous avez fourni, cela n’a aucun sens. Je ne peux donc que supposer que le vrai problème que vous essayez de résoudre est plus complexe: la déduplication peut-être?

La fonctionnalité que vous recherchez est CREATE SEQUENCE , mais je suis presque sûr qu'elle n'est pas disponible dans une version aussi ancienne d'Informix.

Si vous avez vraiment besoin de faire ce que vous demandez, vous pouvez examiner UNLOAD dans les données dans l'ordre souhaité, puis LOAD à nouveau. Cela garantirait une affectation séquentielle des valeurs SERIAL.

Quelque chose comme ce travail-ci?

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

Cela risque de ne pas être très efficace si la table grossit ou si vous récupérez des "pages" plus tard, mais que les lignes de 10 Ko sont assez petites.

Je ne me souviens pas si Informix a un concept ROWNUM, j'utilise Oracle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top