Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL mesclar linhas duplicadas e unir valores que são diferentes


Má prática usar listas separadas por vírgulas. Você pode ler a documentação sobre normalização de banco de dados.

Listas separadas por vírgulas têm muitos problemas práticos :
  • Não é possível garantir que cada valor seja o tipo de dados correto:não há como evitar 1,2,3,banana,5
  • Não é possível usar restrições de chave estrangeira para vincular valores a uma tabela de pesquisa; não há como impor integridade referencial.
  • Não é possível impor exclusividade:não há como evitar 1,2,3,3,3,5
  • Não é possível excluir um valor da lista sem buscar a lista inteira.
  • Não é possível armazenar uma lista maior do que cabe na coluna de string.
  • Difícil pesquisar todas as entidades com um determinado valor na lista; você tem que usar uma varredura de tabela ineficiente. Pode ser necessário recorrer a expressões regulares, por exemplo no MySQL:idlist REGEXP '[[:<:]]2[[:>:]]'
  • Difícil contar elementos na lista ou fazer outras consultas agregadas.
  • Difícil unir os valores à tabela de pesquisa a que eles fazem referência.
  • Difícil buscar a lista em ordem de classificação.
  • Armazenar inteiros como strings ocupa cerca de duas vezes mais espaço do que armazenar inteiros binários. Isso sem falar no espaço ocupado pelas vírgulas.

Mas se você precisar dele para qualquer caso, você pode usar algo assim:
SELECT  FilmID,
        FilmName, 
        Id = REPLACE(
                (
                SELECT DateShown AS [data()]
                FROM YourTable
                WHERE FilmID = a.FilmID
                ORDER BY FilmName FOR XML PATH('')), ' ', ','
                )
FROM    YourTable a
WHERE   FilmName IS NOT NULL
GROUP BY FilmID, FilmName

Mais sobre Listas separadas por vírgulas