2012-05-04 3 views
0

이것은 바보 같이 들리 겠지만 집계 함수가 반환하는 레코드가 1로 제한되는 이유를 알 수 없었습니다. 실용적인 이유보다 더 많이 알고 있습니다.집계 함수가 레코드를 제한하는 이유는 무엇입니까?

id 
1 
2 
3 
4 

지금 SELECT id FROM table 내가

id p 
1 2 
2 2 
3 2 
4 2 

그러나 일에 SELECT id, MAX(2) AS p FROM table 수익률을 가정 내가 SELECT id, id, 1 AS p FROM table을 할 경우 그래서 다음

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

을 제공

id 
1 
2 
3 
4 

를 산출 실제로는 무엇입니까 :

id p 
1 2 

1) 왜 예상치 못한 결과가 나옵니까?

2) MySQL과 SQLite에서이를 발견했습니다. 모든 데이터베이스가 동일하게 응답합니까? 이다)

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

답변

1

1). 집계 함수는 선택 항목의 유일한 열일 때만 사용할 수 있습니다. 이는 단일 값을 반환하고 다른 열은 대부분 둘 이상의 행을 반환하기 때문입니다.

2) Access에서 이것을 시도하고 오류가 발생했습니다. (ID는 집계 함수가 아닙니다 ...). 나는 다른 데이터베이스 시스템을 위해 이것을 시도하지 않았다.

3) 성명 끝 부분에 GROUP BY ID를 추가하여 결과를 얻을 수 있습니다. 이렇게하면 모든 ID 인스턴스에서 집계 함수의 각 결과를 사용하려고한다는 것을 시스템에 알립니다. 이렇게하면 집계 함수 외부에서 ID를 사용할 수 있습니다.

+0

게시자가 게시 한 결과를 제공하지 않으므로 3 포인트가 유효하지 않습니다 (1,1), (2,2), ... – nawfal

+0

이 쿼리는 [링크] (http://i46.tinypic.com/jp7m1h.png)이 결과를 산출합니다 [link] (http://i47.tinypic.com/21e6vee.png). 이것은 원하는 결과와 정확하게 같습니다. – Mononess

+0

그림의 질의가 가능 하겠지만, 여기에있는 질의는'SELECT id, max (id)'입니다. 그 차이가 있습니다, 그에 따라 대답 할 수 있습니까? – nawfal

1

정식 대답 1 : 그 방법의 집합체이고 group by이 정의에 필요한 호기심에서

3) 제가 이런 뷰를 얻기 위해 쿼리 어떻게, 물어 보자 작업.

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

을하고 당신이 예상 정확히 반환 :

은 당신이 할 수있는) 그냥 SQLite는 MySQL의과 (가장 현대적인 DBMS 3)을 다시.

당신이 사용해야 당신이 MySQL을 원하는 얻으려면 하위 선택 : ID가 집계 함수에없는 때문에이 표현을 실행할 수 없습니다

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

감사합니다. 큰 이름! :) over()는 들어 본 적이없는 무언가입니다! – nawfal

+0

@nawfal : 윈도우 함수라고하며 더 멋진 것들을 할 수 있습니다. –

+0

왜 이것이 mysql과 lite 모두에 대해 실행되지 않는 것입니까? – nawfal

관련 문제