Frage

Ich verwende einen Informix (Version 7.32) DB. Bei einer Operation erstelle ich eine TEMP -Tabelle mit der ID einer regulären Tabelle und einer seriellen Spalte (so hätte ich alle IDs aus der regulären Tabelle, die kontinuierlich nummeriert ist). Aber ich möchte die Informationen aus der regulären Tabelle einfügen, die gemäß ID so etwas wie folgt:

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

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

Dies erzeugt jedoch einen Syntaxfehler (wegen der Reihenfolge nach)

Gibt es eine Möglichkeit, die Informationen zu bestellen und sie dann in den Versuchbaren einzufügen?

UPDATE: Der Grund, warum ich dies tun möchte, ist, dass die reguläre Tabelle ungefähr 10.000 Elemente und in einer JSP -Datei enthält. Es muss jeden Datensatz angezeigt werden, aber es würde lange dauern. Der wahre Grund, warum ich dies tun möchte paginieren die Ausgabe. Diese Version von Informix hat nicht Limit Noch Skip. Ich kann die Serie nicht nummerieren, weil sie sich in einer Beziehung befindet. Dies ist die einzige Lösung, die wir auf einer Seite eine feste Anzahl von Ergebnissen erhalten können (z. B. 500 Ergebnisse pro Seite). In der regulären Tabelle hat IDs (genannt Folio), weil sie gelöscht wurden. Wenn ich setzen würde

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

Ich würde vielleicht 300 auf einer Seite und dann 500 auf der nächsten Seite bekommen

War es hilfreich?

Lösung

Sie können es versuchen, einen Cursor über die Auswahl ... bestellen zu lassen und die Einfügungen in der Schleife durchzuführen.

Andere Tipps

Sie können dies tun, indem Sie den SQL in zwei Tempi -Tabellen unterteilen:

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;

In Informix, wenn Sie einen SELECT als Unterklausel in einer Einfügeanweisung verwenden, sind Sie begrenzt auf eine Teilmenge der Auswahlsyntax.

Die folgenden Auswahlklauseln werden in diesem Fall nicht unterstützt:

  • In Temp
  • SORTIEREN NACH
  • UNION.

Darüber hinaus kann die From -Klausel des SELECT nicht auf die gleiche Tabelle verweisen, auf die der Einfügen verwiesen wird (nicht, dass dies in Ihrem Fall wichtig ist).

Es ist Jahre her, seit ich an Informix gearbeitet habe, aber vielleicht wird so etwas funktionieren:

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

Es macht keinen Sinn, die Zeilen zu bestellen, wenn Sie in eine Tabelle einfügen. Relationale Datenbanken ermöglichen es Ihnen nicht, die Reihenfolge der Zeilen in einer Tabelle anzugeben.

Selbst wenn Sie könnten, garantiert SQL nicht, dass eine Abfrage Zeilen in jeder Reihenfolge zurückgibt, z. B. die Bestellung, die Sie eingefügt haben. Sie müssen eine angeben ORDER BY Klausel, um eine Bestellung für ein Abfrageergebnis zu gewährleisten.

Es würde Ihnen also nicht gut tun, die Reihenfolge zu ändern, in der Sie die Zeilen einfügen.

Wie von Bill angegeben, gibt es nicht viel Punkt, der die Eingabe bestellt, Sie müssen die Ausgabe wirklich bestellen. In dem simplen Beispiel, das Sie bereitgestellt haben, macht es einfach keinen Sinn, sodass ich nur davon ausgehen kann, dass das eigentliche Problem, das Sie lösen möchten, komplexer ist - vielleicht eine Deduplizierung?

Die Funktionalität, die Sie suchen, ist CREATE SEQUENCE, aber ich bin mir ziemlich sicher, dass es in einer so alten Version von Informix nicht verfügbar ist.

Wenn Sie wirklich das tun müssen, was Sie fragen, können Sie sich untersuchen UNLOADdie Daten in der erforderlichen Reihenfolge und dann LOADwieder es. Dies würde sicherstellen, dass die Serienwerte nacheinander zugeteilt werden.

Würde so etwas wie diese funktionieren?

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

Es ist vielleicht nicht besonders effizient, wenn der Tisch größer wird oder Sie später "Seiten" holen, aber 10K -Reihen sind ziemlich klein.

Ich erinnere mich nicht, ob Informix ein Rownum -Konzept hat, ich benutze Oracle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top