2011-09-25 30 views
8

comparar¿por qué esta consulta devuelve una fila con nulos

SELECT distinct u_id,timestamp as time 
FROM my_table; 

y

SELECT distinct u_id,max(timestamp) as time 
FROM my_table; 

Cuando mi tabla tiene ninguna fila en absoluto (o si añado una cláusula where que coincide con ninguna fila):

El primero devuelve un conjunto de resultados vacío (que es lo que espero) mientras que el último devuelve una sola fila que tiene nulo como valor para ambos campos.

¿Puede alguien explicarme por qué la segunda actúa como lo hace?

Respuesta

16

documentación de MySQL dice

MAX() devuelve NULL si no hay registros coincidentes.

Y si no tiene datos, simplemente devuelve ambos valores como NULL.

Si desea que la segunda consulta devuelve el conjunto de resultados vacío, lo que tiene que filtrar los valores NULL, por ejemplo, con la cláusula que se puede utilizar con las funciones de agregado que tiene:

SELECT DISTINCT u_id, MAX(timestamp) as time FROM my_table GROUP BY u_id HAVING time IS NOT NULL; 
+2

Esto es técnicamente solo la mitad de la respuesta - la otra mitad es la ausencia de la cláusula group-by en el segundo al usar funciones agregadas mezcladas con no agregados, por lo que el u_id es 'NULL' – tobyodavies

0

Esta respuesta real a esta pregunta es bastante complicado de explicar, para mí de todos modos :) Puntos principales: SQL no admite operadores agregados como se encuentra en el modelo relacional, más bien simplemente admite un caso especial de resumen. Además, dado que SQL tiene una estructura de datos única, la tabla: las invocaciones de operador agregadas de SQL (en términos generales) deben aparecer como parte de alguna expresión de tabla, por lo que su segunda tabla devuelve una única fila "ficticia".

Para una explicación más completa/mejor, vea SQL and Relational Theory: How to Accurate SQL Code - C. J. Date (2009), sección 7.5. Operadores agregados

Cuestiones relacionadas