Pregunta

Estoy usando una base de datos Informix (Versión 7.32). En una operación, creo una tabla temporal con la ID de una tabla regular y una columna en serie (para tener todas las ID de la tabla regular numeradas continuamente). Pero quiero insertar la información de la tabla normal ordenada por ID, algo así como:

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

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

Pero esto crea un error de sintaxis (debido a ORDER BY)

¿Hay alguna forma de ordenar la información y luego insertarla en la tabla temporal?

ACTUALIZACIÓN: La razón por la que quiero hacer esto es porque la tabla normal tiene alrededor de 10,000 elementos y en un archivo jsp, tiene que mostrar todos los registros, pero tomaría mucho tiempo, así que la verdadera razón por la que quiero hacer esto es paginar la salida. Esta versión de Informix no tiene Limit ni Skip . No puedo renumerar el número de serie porque está en una relación, y esta es la única solución que podríamos obtener un número fijo de resultados en una página (por ejemplo, 500 resultados por página). En la tabla Regular se han omitido los id (llamados folio) porque se han eliminado. si tuviera que poner

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

Obtendría quizás 300 en una página, luego 500 en la página siguiente

¿Fue útil?

Solución

Puede intentar iterar un cursor sobre SELECT ... ORDER BY y hacer INSERTs dentro del ciclo.

Otros consejos

Puede hacer esto dividiendo el SQL en dos tablas temporales:

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;

En Informix cuando se utiliza un SELECT como una subcláusula en una instrucción INSERT, está limitado a un subconjunto de la sintaxis SELECT .

Las siguientes cláusulas SELECT no son compatibles en este caso:

  • EN TEMPERATURA
  • ORDENAR
  • UNIÓN.

Además, la cláusula FROM de SELECT no puede hacer referencia a la misma tabla a la que hace referencia INSERT (no es que esto importe en su caso).

Han pasado años desde que trabajé en Informix, pero quizás algo así funcione:

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

No tiene sentido ordenar las filas a medida que las inserta en una tabla. Las bases de datos relacionales no le permiten especificar el orden de las filas en una tabla.

Incluso si pudiera, SQL no garantiza que una consulta devolverá filas en cualquier orden, como el orden en que las insertó. Debe especificar una cláusula ORDER BY para garantizar un pedido para el resultado de una consulta.

Por lo tanto, no sería bueno cambiar el orden en que inserta las filas.

Como dijo Bill, no hay muchos puntos para ordenar la entrada, realmente necesita ordenar la salida. En el ejemplo simplista que ha proporcionado, simplemente no tiene sentido, por lo que solo puedo suponer que el problema real que está tratando de resolver es más complejo: ¿deduplicación tal vez?

La funcionalidad que busca es CREATE SEQUENCE , pero estoy bastante seguro de que no está disponible en una versión tan antigua de Informix.

Si realmente necesita hacer lo que está pidiendo, puede mirar UNLOAD e ingresar los datos en el orden requerido, y luego LOAD volver a ingresarlos. Eso aseguraría que los valores SERIAL se asignen secuencialmente.

¿Funcionaría algo como esto?

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

Puede que no sea terriblemente eficiente si la tabla se hace más grande o si va a buscar más adelante "páginas", pero las filas de 10K son bastante pequeñas.

No recuerdo si Informix tiene un concepto ROWNUM, uso Oracle.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top