2012-05-04 2 views
0

Это должно звучать глупо, но я никогда не понимал, почему агрегатные функции ограничивают записи, возвращенные 1. Больше, чем любая практическая причина, это только знать.Почему агрегатные функции ограничивают записи

id 
1 
2 
3 
4 

Теперь SELECT id FROM table дает

id 
1 
2 
3 
4 

Если я SELECT id, id, 1 AS p FROM table это дает

id id p 
1  1 1 
2  2 1 
3  3 1 
4  4 1 

Так следующий я предполагаю SELECT id, MAX(2) AS p FROM table урожаи в

id p 
1 2 
2 2 
3 2 
4 2 

Но го на самом деле дает:

id p 
1 2 

1) Почему это происходит с агрегатными функциями и не дает ожидаемого результата?

2) Я нашел это с MySQL и SQLite. Все ли ответы на все базы данных?

3) Из любопытства позвольте мне спросить, как я могу запросить, чтобы получить представление, как это:

id max(id) 
1 4 
2 4 
3 4 
4 4 

ответ

1

1) Вы не можете выполнить это выражение, потому что ID не в агрегатной функции. Агрегатные функции могут использоваться только тогда, когда они являются единственным столбцом в выборе. Это происходит потому, что они возвращают одно значение, а другие столбцы в основном возвращают более одной строки.

2) Я попробовал это в Access и получил ошибку. (ID не в совокупной функции ...). Я еще не пробовал это для других систем баз данных.

3) Вы можете получить свой результат, добавив GROUP BY ID в конце инструкции. Это сообщает системе, что вы хотите использовать каждый результат агрегатной функции для каждого экземпляра идентификатора. Это позволяет использовать идентификатор вне функции агрегации.

+0

ваш третий пункт недействителен, так как он не дает результат, как я писал, вместо этого он дает (1,1), (2,2), .... – nawfal

+0

Этот запрос [ссылка] (http://i46.tinypic.com/jp7m1h.png) дает этот результат [ссылка] (http://i47.tinypic.com/21e6vee.png). Это похоже на ваш желаемый результат. – Mononess

+0

Запрос в pic будет делать, но мой запрос здесь: 'SELECT id, max (id)'. Это имеет значение, можно ли ответить соответственно? – nawfal

1

канонический ответ 1): это способ, агрегаты и group by определены и должны Работа.

повторно 3) в большинстве современной СУБД (только не в MySQL и SQLite), вы можете сделать это:

select id, 
     max(id) over() 
from your_table; 

и возвращающий бы именно то, что вы ожидали.

Чтобы получить то, что вы хотите в MySQL вы должны использовать суб-выбора:

select id, 
     (select max(id) from your_table) 
from your_table; 
+0

спасибо и большое имя! :) over() - это то, о чем я никогда не слышал! – nawfal

+0

@nawfal: это называется оконными функциями и может делать намного более интересные вещи. –

+0

Почему это даже не выполняется для mysql и lite? – nawfal