sql >> Base de Datos >  >> RDS >> Mysql

SQL fusiona filas duplicadas y une valores que son diferentes

Mala práctica para usar listas separadas por comas. Puede leer la documentación sobre la normalización de la base de datos.

Las listas separadas por comas tienen muchos problemas prácticos :

  • No se puede garantizar que cada valor sea el tipo de datos correcto:no hay forma de evitarlo 1,2,3,banana,5
  • No se pueden usar restricciones de clave externa para vincular valores a una tabla de búsqueda; no hay forma de hacer cumplir la integridad referencial.
  • No se puede hacer cumplir la singularidad:no hay forma de evitar 1,2,3,3,3,5
  • No se puede eliminar un valor de la lista sin obtener la lista completa.
  • No se puede almacenar una lista más larga de lo que cabe en la columna de cadena.
  • Difícil de buscar todas las entidades con un valor dado en la lista; tienes que usar un escaneo de tabla ineficiente. Puede que tenga que recurrir a expresiones regulares, por ejemplo en MySQL:idlist REGEXP '[[:<:]]2[[:>:]]'
  • Difícil contar elementos en la lista, o hacer otras consultas agregadas.
  • Es difícil unir los valores a la tabla de búsqueda a la que hacen referencia.
  • Es difícil obtener la lista en orden.
  • El almacenamiento de números enteros como cadenas ocupa aproximadamente el doble de espacio que el almacenamiento de números enteros binarios. Sin mencionar el espacio que ocupan los caracteres coma.

Pero si lo necesita para cualquier caso, podría usar algo como eso:

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

Más sobre Listas separadas por comas