Pergunta

Estou usando um db do Informix (versão 7.32). Em uma operação, crio uma tabela de temperatura com o ID de uma tabela regular e uma coluna serial (para que eu tivesse todos os IDs da tabela comum numerada continuamente). Mas quero inserir as informações da tabela regular encomendada por id algo como:

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

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

Mas isso cria um erro de sintaxe (por causa da ordem por)

Existe alguma maneira de solicitar as informações e inseri -las no tentável?

ATUALIZAÇÃO: O motivo pelo qual quero fazer isso é porque a tabela regular tem cerca de 10.000 itens e, em um arquivo JSP, ele precisa mostrar todos os registros, mas levaria muito tempo, então a verdadeira razão pela qual eu quero fazer isso é para paginar a saída. Esta versão do Informix não tem Limit nem Skip. Não posso renumerar a série porque está em um relacionamento, e esta é a única solução que poderíamos obter um número fixo de resultados em uma página (por exemplo, 500 resultados por página). Na mesa regular pulou os IDs (chamados fólio) porque eles foram excluídos. Se eu fosse colocar

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y

Eu receberia talvez 300 em uma página, depois 500 na próxima página

Foi útil?

Solução

Você pode tentar iterando um cursor sobre o pedido de seleção ... fazendo as inserções dentro do loop.

Outras dicas

Você pode fazer isso dividindo o SQL em duas tabelas temporárias:

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;

Em Informix ao usar uma seleção como uma subcláusula em uma declaração de inserção, você é limitado a um subconjunto da sintaxe selecionada.

As seguintes cláusulas selecionadas não são suportadas neste caso:

  • Em temp
  • ORDENAR POR
  • UNIÃO.

Além disso, a cláusula de seleção não pode fazer referência à mesma tabela como referenciada pela inserção (não que isso importa no seu caso).

Faz anos desde que trabalhei no Informix, mas talvez algo assim funcione:

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

Não faz sentido pedir as linhas enquanto você insere em uma tabela. Os bancos de dados relacionais não permitem especificar a ordem das linhas em uma tabela.

Mesmo se você pudesse, o SQL não garante uma consulta retornará linhas em qualquer ordem, como a ordem que você as inseriu. Você deve especificar um ORDER BY Cláusula para garantir um pedido para um resultado de consulta.

Portanto, não seria bom alterar a ordem em que você insere as linhas.

Conforme declarado por Bill, não há muito ponto de ordem da entrada, você realmente precisa solicitar a saída. No exemplo simplista que você forneceu, isso não faz sentido, então só posso assumir que o verdadeiro problema que você está tentando resolver é mais complexo - talvez a desduplicação?

A funcionalidade que você está depois é CREATE SEQUENCE, mas tenho certeza de que não está disponível em uma versão tão antiga do Informix.

Se você realmente precisa fazer o que está perguntando, pode olhar para UNLOADos dados na ordem necessária e depois LOADde novo. Isso garantiria que os valores seriais fossem alocados sequencialmente.

Algo assim funcionaria?

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

Pode não ser terrivelmente eficiente se a tabela crescer ou você estiver buscando mais tarde "páginas", mas 10k linhas é bem pequeno.

Não me lembro que se o Informix tem um conceito de Rownum, eu uso o Oracle.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top