Pessoal,

Possuo uma tabela de histórico de leitura, onde cada registro possui o id
da tabela pai:

tabela_documento = tabela pai (contém os dados principais do objeto)
tabela_historico = historico de leituras (contém data, hora, origem e
destino de cada objeto).

Resumindo, para cada registro na tabela pai, eu posso ter vários registros
na tabela de histórico.

O meu problema está que por uma falha na programação, o sistema não
obedeceu essa regra, ficou no relacionamento 1 para 1.

Preciso agora corrigir isso, pegar todos os registros da tabela de
histórico e atualizá-los com um único id da tabela pai correspondente.

Pensei em utilizar a querie abaixo, onde eu monto o comando de update na
tabela de histórico e delete na tabela pai

SELECT
    , 'UPDATE historico SET idpai =
'||split_part(string_agg(idpai::text,','),',',1)||' WHERE (idhistorico IN
('||string_agg(idhistorico::text,',')||'));'
    , 'DELETE FROM tabela_pai WHERE (idpai IN
('||string_agg(idpai::text,',')||')) AND (idpai <>
'||split_part(string_agg(idpai::text,','),',',1)||');'
FROM historico GROUP BY codempresa,codcliente,codproduto,codbarras HAVING
COUNT(*) > 1

mas encontrei 2 problemas, o primeiro é a demora no select, cancelei o
select após 25 minutos (a tabela possui em torno de 980 mil registros), o
segundo é o limite de caracteres de retorno da função string_agg (retorna
parte dos códigos, pois no final fica "(...)".

Vamos lá, existe uma forma melhor de executar o eu preciso?

A função string_agg realmente possui essa limitação?

[]s
Danilo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a