No momento, estou ocupado implementando um tipo de filtro para o qual preciso gerar uma cláusula INNER JOIN para cada "tag" a ser filtrada.
O problema é que, depois de muito SQL, tenho uma tabela que contém todas as informações de que preciso para fazer minha seleção, mas preciso dela novamente para cada INNER JOIN gerado
Isso basicamente se parece com:
SELECT
*
FROM search
INNER JOIN search f1 ON f1.baseID = search.baseID AND f1.condition = condition1
INNER JOIN search f2 ON f2.baseID = search.baseID AND f2.condition = condition2
...
INNER JOIN search fN ON fN.baseID = search.baseID AND fN.condition = conditionN
Isso funciona, mas eu preferiria que a tabela de "pesquisa" fosse temporária (pode ser várias ordens de magnitude menor se não for uma tabela normal), mas isso me dá um erro muito irritante: Can't reopen table
Algumas pesquisas me levam a este relatório de bug, mas o pessoal do MySQL não parece se importar que esse recurso básico (usar uma tabela mais de uma vez) não funcione com tabelas temporárias. Estou tendo muitos problemas de escalabilidade com esse problema.
Existe alguma solução alternativa viável que não exija que eu gerencie muitas tabelas temporárias, mas muito reais, ou me obrigue a manter uma tabela enorme com todos os dados nela?
Atenciosamente, Kris
[adicional]
A resposta GROUP_CONCAT não funciona na minha situação porque minhas condições são várias colunas em uma ordem específica, faria ORs do que eu preciso ser ANDs. No entanto, isso me ajudou a resolver um problema anterior, então agora a mesa, temporária ou não, não é mais necessária. Estávamos pensando genérico demais para o nosso problema. A aplicação inteira de filtros agora foi trazida de cerca de um minuto para bem menos de um quarto de segundo.
fonte
Respostas:
Se mudar para MariaDB (um fork do MySQL) é viável - esse incômodo foi corrigido lá a partir da versão 10.2.1: https://jira.mariadb.org/browse/MDEV-5535 .
fonte
Uma solução simples é duplicar a tabela temporária. Funciona bem se a tabela for relativamente pequena, o que geralmente é o caso com tabelas temporárias.
fonte
Certo, os documentos do MySQL dizem: "Você não pode se referir a uma
TEMPORARY
tabela mais de uma vez na mesma consulta."Aqui está uma consulta alternativa que deve encontrar as mesmas linhas, embora todas as condições de linhas correspondentes não estejam em colunas separadas, elas estarão em uma lista separada por vírgulas.
fonte
Eu contornei isso criando uma tabela "temporária" permanente e sufixando o SPID (desculpe, eu sou do SQL Server Land) para o nome da tabela, para fazer um nome de tabela exclusivo. Em seguida, criar instruções SQL dinâmicas para criar as consultas. Se algo de ruim acontecer, a tabela será descartada e recriada.
Espero uma opção melhor. Vamos, MySQL Devs. O 'bug' / 'solicitação de recurso' está aberto desde 2008! Parece que todos os 'bugs' que encontrei estão no mesmo barco.
fonte
Pessoalmente, eu apenas faria dela uma mesa permanente. Você pode querer criar um banco de dados separado para essas tabelas (presumivelmente, eles precisarão de nomes exclusivos, pois muitas dessas consultas podem ser feitas de uma vez), também para permitir que as permissões sejam definidas de maneira sensata (você pode definir permissões nos bancos de dados; você pode ' t definir permissões em curingas de tabela).
Então você também precisaria de um trabalho de limpeza para remover os antigos ocasionalmente (o MySQL lembra convenientemente a hora em que uma tabela foi criada, então você poderia apenas usar isso para resolver quando uma limpeza foi necessária)
fonte
Consegui alterar a consulta para uma tabela permanente e isso corrigiu para mim. (alterou as configurações de VLDB no MicroStrategy, tipo de tabela temporária).
fonte
Você pode contornar isso criando uma tabela permanente, que irá remover depois, ou apenas fazendo 2 tabelas temporárias separadas com os mesmos dados
fonte
Aqui estão os documentos MYSQL sobre este assunto. Eu uso tabelas temporárias duplicadas como algumas das respostas acima, entretanto, você pode ter uma situação em que um CTE seja apropriado!
https://dev.mysql.com/doc/refman/8.0/en/temporary-table-problems.html
fonte