Transpor uma linha em colunas com MySQL sem utilizar SINDICATOS?
Pergunta
Eu tenho uma tabela que é semelhante ao seguinte abaixo:
id | cat | one_above | top_level |
0 'printers' 'hardware' 'computers'
Eu quero ser capaz de escrever uma consulta, sem usar sindicatos , que vai me devolver um conjunto de resultados que transpõe as colunas dessa tabela em fileiras. O que isto significa, é que eu quero que o resultado seja:
id | cat |
0 'printers'
0 'hardware'
0 'computers'
Isso é possível no MySQL? Eu não pode cair para a camada de aplicação e executar isso porque eu estou alimentando estes em um motor de busca que o índice vontade com base no id. Vários outros DBMS ter algo como pivô e UNPIVOT. Gostaria muito de receber qualquer insight para algo que eu estou sentindo falta.
Mahmoud
P.S.
Estou pensando em re-normalização do banco de dados como uma última opção, uma vez que esta não será uma tarefa trivial.
Obrigado!
Solução
Eu tenho esse do livro The Art of SQL, páginas 284-286:
Vamos dizer que seu nome da tabela é foo
.
Primeiro, crie uma tabela chamada pivot
:
CREATE Table pivot (
count int
);
Inserir em que as tabelas como muitas linhas como existem colunas que deseja pivot em foo
. Desde que você tem três colunas em foo
que deseja pivô, criar três linhas na tabela dinâmica:
insert into pivot values (1);
insert into pivot values (2);
insert into pivot values (3);
Agora, uma junção cartesiana entre foo
e pivot
, usando um CASE
para selecionar a coluna correta com base na contagem:
SELECT foo.id, Case pivot.count
When 1 Then cat
When 2 Then one_above
When 3 Then top_level
End Case
FROM foo JOIN pivot;
Isso deve lhe dar o que você quer.
Outras dicas
Depois de algumas escavações bastante extensa eu tropecei em esta página que pode ou não pode conter sua resposta. É uma difícil em MySQL mas de um ponto de vista conceitual eu posso construir uma consulta que transpor como esta usando descrever (embora ele provavelmente iria realizar horrivelmente). Então, eu tenho certeza de que podemos descobrir uma maneira de fazê-lo da maneira certa.