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

MySQL - Selección de una columna que no está en Agrupar por

Es cierto que esta característica permite algunas consultas ambiguas y devuelve silenciosamente un conjunto de resultados con un valor arbitrario seleccionado de esa columna. En la práctica, tiende a ser el valor de la fila dentro del grupo que se almacena físicamente primero.

Estas consultas no son ambiguas si solo elige columnas que dependen funcionalmente de las columnas en los criterios GROUP BY. En otras palabras, si solo puede haber un valor distinto de la columna "ambigua" por valor que define el grupo, no hay problema. Esta consulta sería ilegal en Microsoft SQL Server (y ANSI SQL), aunque lógicamente no puede generar ambigüedad:

SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;

Además, MySQL tiene un modo SQL para que se comporte según el estándar:ONLY_FULL_GROUP_BY

FWIW, SQLite también permite estas cláusulas GROUP BY ambiguas, pero elige el valor del último fila en el grupo.

Al menos en la versión que probé. Qué significa ser arbitrario es que MySQL o SQLite podrían cambiar su implementación en el futuro y tener un comportamiento diferente. Por lo tanto, no debe confiar en que el comportamiento se mantenga como está actualmente en casos ambiguos como este. Es mejor reescribir sus consultas para que sean deterministas y no ambiguas. Es por eso que MySQL 5.7 ahora habilita ONLY_FULL_GROUP_BY de manera predeterminada.