2009-05-05 2 views

답변

2

을이 표에서 상위 5 득점을 얻으려면 :

SELECT id, 
     name, 
     score 
FROM people p 
WHERE (SELECT COUNT(*) 
     FROM people p2 
     WHERE p2.score > p.score 
     ) <=4 

나는이 일을한다고 생각 :

CREATE TABLE people 
      (id  int, 
       name string, 
       score int) 

이 SQL을 시도 대부분의 장소에서.

2

아니요 구문은 다릅니다.

당신은, 그러나,보기를 만들 수 있습니다

/* Oracle */ 

CREATE VIEW v_table 
AS 
SELECT * 
FROM (
     SELECT * 
     FROM table 
     ORDER BY 
       column 
     ) 
WHERE rownum <= n 

/* MySQL */ 

CREATE VIEW v_table 
AS 
SELECT * 
FROM table 
ORDER BY 
     column 
LIMIT n 
+1

(최소한 TOP n 절을 사용할 때 SQL 서버에서)보기를 강제해야한다는 제한 사항이 있습니다. – Tomalak

+1

그리고 다른 DBMS는 개념을 지원하지만 다른 표기법을 사용합니다. –

+0

또한 일부 DBMS는 뷰에서 ORDER BY 절을 허용하지 않습니다. –

1

나는 심지어 단지 MySQL과 MSSQL 사이에 가능하다고 생각하지 않습니다. 그러나 이러한 동작을 시뮬레이션하기위한 옵션을 사용합니다.

  1. 자동 증가 된 int 열이있는 뷰를 만듭니다. 말처럼 'PagingHelperID'
  2. 쓰기 쿼리 :이 어려운 주문하게됩니다 SELECT columns FROM viewname WHERE PagingHelperID BETWEEN startindex AND stopindex

, 당신은 데이터를 retreive하고자하는 모든 주문에 대해 서로 다른 견해를해야합니다.

또한 데이터베이스에 따라 쿼리 할 때 SQL을 "다시 작성"하고 다시 작성기에 대한 고유 한 메서드를 정의 할 수 있지만 "좋은"방법이 없다고 생각합니다.

+0

오른쪽. 나는 어떤 종류의 데이터베이스 탐지도 피하고자한다. – pugmarx

1

테이블 예에 고유 키가있는 경우 ...

Select * From Table O 
Where (Select Count(*) From Table I 
     Where [UniqueKeyValue] < O.UniqueKeyValue) < N 
당신이 "최고"정의가 고유 키보다 다른 논리를 기반으로 할 경우 당신은 당신의 자신의 기준을 대체 할 수

...

EDIT : "Top"의 의미를 정의하는 "sort"가 고유하지 않은 열 또는 열 집합을 기반으로하는 경우에도이 값을 사용할 수는 있지만 사용자를 보장 할 수는 없습니다 정확히 N 개의 레코드를 가져올 수 있습니다 ...

Select * From Table O 
    Where (Select Count(*) From Table I 
     Where nonUniqueCol < O.nonUniqueCol) < 10 

레코드 8, 9, 10, 11 및 12가 모두 [nonUniqueCol]에서 동일한 값을 갖는 경우 쿼리는 7 개의 레코드 ('<'포함) ... 또는 12 (사용하는 경우 '< =')

참고 :이 상관 하위 쿼리를 포함으로, 성능은 내가 모든 제품이를 달성하기 위해 다른 구문을 다음과 생각이 매우 큰 테이블에 대한 문제 ...

+0

고유 키가 GUID 또는 다른 비 순차적 데이터 인 경우 어떻게해야합니까? –

+0

고유 키를 사용하면 레코드를 식별 할 수 있습니다. "Top"의 의미를 정의하는 "정렬"이 다른 다른 논리를 기반으로하는 경우 하위 쿼리는 해당 레코드를 "계산"하도록 작성됩니다 논리 ... 그렇다면 유일한 문제는 N 값이 여러 인스턴스가있는 특정 값에서 발생하는 경우입니다 (레코드 8, 9, 10 및 11 모두 동일한 값을 갖는 경우 가능합니다. 상위 10 개) –

0

큰 문제는 이것을 살펴본 후 MySQL이 ISO SQL : 2003을 준수하지 않는다는 것입니다. 그것이 경우에, 당신은이 편리한 윈도우 기능이있을 것이다 :

SELECT * from 
( SELECT 
    RANK() OVER (ORDER BY <blah>) AS ranking, 
    <rest of columns here>, 
    FROM <table> 
) 
WHERE ranking <= <N> 

아아, MySQL은 (는 행동의 모방과 다른 사람, 예를 들어, SQLite는), 따라서 전체를 제한하지 않는 문제를.

체크 아웃 위키 백과에서이 조각 (http://en.wikipedia.org/wiki/Window_function_(SQL)#Limiting_result_rows)