Domanda

Sto usando un DB Informix (Versione 7.32). In un'operazione creo una tabella temporanea con l'ID di una tabella normale e una colonna seriale (in modo da avere tutti gli ID della tabella normale numerati in modo continuo). Ma voglio inserire le informazioni dalla tabella normale ordinate per ID qualcosa come:

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

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

Ma questo crea un errore di sintassi (a causa di ORDER BY)

Esiste un modo per ordinare le informazioni e inserirle nella tabella di tentativi?

AGGIORNAMENTO: Il motivo per cui voglio farlo è perché la tabella normale ha circa 10.000 elementi e in un file jsp, deve mostrare tutti i record, ma ci vorrebbe troppo tempo, quindi il vero motivo per cui voglio farlo è impaginare l'output. Questa versione di Informix non ha Limit Skip . Non riesco a rinumerare il seriale perché è in una relazione e questa è l'unica soluzione che è possibile ottenere un numero fisso di risultati su una pagina (ad esempio 500 risultati per pagina). Nella tabella Regular sono stati ignorati gli ID (chiamati folio) perché sono stati eliminati. se dovessi mettere

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

Avrei forse 300 in una pagina, quindi 500 nella pagina successiva

È stato utile?

Soluzione

Potresti provare iterando un cursore sopra SELEZIONA ... ORDINA E eseguendo gli INSERTI all'interno del ciclo.

Altri suggerimenti

Puoi farlo suddividendo l'SQL in due tabelle temporanee:

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 quando si utilizza un SELECT come una sotto-clausola in un'istruzione INSERT, si è limitati a un sottoinsieme della sintassi SELECT .

Le seguenti clausole SELECT non sono supportate in questo caso:

  • INTO TEMP
  • ORDINA PER
  • UNION.

Inoltre, la clausola FROM di SELECT non può fare riferimento alla stessa tabella a cui fa riferimento INSERT (non che questo sia importante nel tuo caso).

Sono passati anni da quando ho lavorato su Informix, ma forse qualcosa del genere funzionerà:

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

Non ha senso ordinare le righe mentre le si inserisce in una tabella. I database relazionali non consentono di specificare l'ordine delle righe in una tabella.

Anche se tu potessi, SQL non garantisce che una query restituirà le righe in qualsiasi ordine, come l'ordine in cui le hai inserite. È necessario specificare una clausola ORDER BY per garantire un ordine per un risultato della query.

Quindi non ti farebbe bene cambiare l'ordine in cui inserisci le righe.

Come affermato da Bill, non c'è molto senso ordinare l'input, devi davvero ordinare l'output. Nell'esempio semplicistico che hai fornito, non ha proprio senso, quindi posso solo supporre che il vero problema che stai cercando di risolvere sia più complesso - forse la deduplicazione?

La funzionalità che stai cercando è CREATE SEQUENCE , ma sono abbastanza sicuro che non sia disponibile in una versione così vecchia di Informix.

Se hai davvero bisogno di fare quello che stai chiedendo, puoi esaminare UNLOAD per inserire i dati nell'ordine richiesto, e quindi LOAD per reinserirli. Ciò garantirebbe l'assegnazione sequenziale dei valori SERIAL.

Potrebbe funzionare qualcosa del genere?

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

Potrebbe non essere terribilmente efficiente se la tabella diventa più grande o stai recuperando più tardi "pagine", ma 10K righe sono piuttosto piccole.

Non ricordo se Informix ha un concetto ROWNUM, io uso Oracle.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top