2011-09-25 4 views
8

сравнитьпочему этот запрос возвращает строку с нулями

SELECT distinct u_id,timestamp as time 
FROM my_table; 

и

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

Когда моя таблица не имеет ни одной строки на всех (или, если добавить, где положение, что не соответствует ни одной строки):

Первый возвращает пустой набор результатов (это то, что я ожидаю) , а позже возвращает одну строку, которая имеет значение null как значение для обоих полей.

Может кто-нибудь объяснить мне, почему второй действует так, как он?

ответ

16

MySQL документация говорит

MAX() возвращает NULL, если не было соответствующих строк.

И если у вас нет данных, он просто возвращает оба значения как NULL.

Если вы хотите второй запрос возвращает пустой результирующий тоже, то вы должны отфильтровать NULL значения, например, с HAVING пункт, который можно использовать с агрегатными функциями:

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

Это технически только половина ответа - вторая половина - отсутствие предложения group-by во втором, используя комбинированные функции, смешанные с неагрегатами, поэтому u_id является 'NULL' – tobyodavies

0

Это фактический ответ на этот вопрос довольно сложно объяснить, для меня так или иначе :) Headline points: SQL не поддерживает агрегированные операторы, найденные в реляционной модели, а просто поддерживает специальный случай суммирования. Кроме того, поскольку SQL имеет только одну структуру данных - вызовы операторов агрегации таблицы - SQL (свободно говорящие) должны отображаться как часть некоторого табличного выражения, поэтому ваша вторая таблица возвращает «фиктивную» одну строку.

Для более полного/лучшего объяснения см. Раздел SQL and Relational Theory: How to Accurate SQL Code - C. J. Date (2009), раздел 7.5. Совокупные операторы.

Смежные вопросы