2014-01-07 3 views
0

웹 응용 프로그램 용 SQL 문을 작성할 때 약간의 문제가 있습니다.SQL 데이터베이스에서 단 하나의 최소 레코드 만 표시하는 방법

to_do_list (id, duration, text)가있는 표가 있는데 하나 이상의 최소 레코드 (기간 = 최소값) 만 표시하려고합니다.

Select * from to_do_list where duration = (select min(duration) from to_do_list); 

을하지만 더 이상의 레코드를 (내가 같은 시간에 몇 져야 할 엔트리가) 표시

I는 다음과 같이 떨어지게 만들었다.

나는이 일을 시도 :하지만이 쿼리를 실행 한 후 나는 오류가 발생

Select id, min(duration), text from to_do_list; 

:

가 포함되지 않기 때문에

"열 'to_do_list.id'는 선택 목록에서 유효하지 않습니다 . 집계 함수 나 GROUP BY 절 중 하나

나는 그 한계 내 문제를 해결해야 찾았지만, 나는이 하나 실행 한 후 오류를 받고 있어요 :

를 나는 U의 PPL에서 어떤 도움 감사 드리겠습니다 마이크로 소프트 SQL Express 서버를 2012

을 사용하고

" '한계'. 근처의 구문이 잘못되었습니다"!

미리 감사드립니다.

+0

오류는 'group by'이 누락되었음을 자체적으로 설명합니다. 그룹화하지 않고 집계 할 수는 없습니다. 그 값이 단지 무작위가 될 것이므로'TOP 1 '을 원하지 않을 것입니다. 당신은 찾고있는 결과를 명확히해야합니다. – Zane

답변

1

LIMIT, SQL 서버에서 작동하는 대신 TOP를 사용하지 않습니다

SELECT TOP 1 * 
FROM to_do_list 
WHERE duration = (SELECT MIN(duration) 
        FROM to_do_list); 

당신은이에 대한 ROW_NUMBER() 기능을 사용할 수 있습니다 : 제 생각에는

;WITH cte AS (SELECT *, ROW_NUMBER() OVER(ORDER BY duration) RN 
       FROM to_do_list) 
SELECT * 
FROM cte 
WHERE RN = 1 
+0

이것은 OP가 자신이받는 작업을 신경 쓰지 않는 경우에만 작동합니다. – Zane

1

을이 :

select top 1 * 
from to_do_list t 
order by t.duration 

보다 바람직합니다.
select top 1 * 
from to_do_list t 
where t.duration = select min(duration) from to_do_list) 

어떤 것이 더 나은지 확인하기 위해 실행 계획을 확인하는 것이 좋습니다.

+0

OP가 자신이받는 작업을 신경 쓰지 않는 경우에만 작동합니다. – Zane

+0

네, 일관되게 넥타이를 풀려면'order by t.duration, other_expression' 명령을 사용해야합니다. –

+0

@Zane : 원본 문제 문을 * 읽으려고 할 수 있습니다. "테이블이 있습니다. 하나 이상의 최소 레코드 (Duration = 최소값) 만 표시하려고합니다. " O.P. *가 최소 지속 기간을 갖는 특정 행을 선택하는 것에 관심을 가질 수 있지만, 그는 단지 ** ** 단일 행을 원한다고 말했다. –

관련 문제