SQL 쿼리를 사용하여 상위 N 개의 행을 선택할 수 있기를 원합니다. 대상 데이터베이스는 Oracle 또는 MySQL 일 수 있습니다. 이것에 대한 우아한 접근이 있습니까? (물론 여기에서는 정렬 된 데이터를 다루고 있습니다.)상위 N 개 행을 가져 오기 위해 데이터베이스에 무관 한 SQL 쿼리가있을 수 있습니까?
답변
을이 표에서 상위 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을 시도 대부분의 장소에서.
아니요 구문은 다릅니다.
당신은, 그러나,보기를 만들 수 있습니다
/* 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
나는 심지어 단지 MySQL과 MSSQL 사이에 가능하다고 생각하지 않습니다. 그러나 이러한 동작을 시뮬레이션하기위한 옵션을 사용합니다.
- 자동 증가 된 int 열이있는 뷰를 만듭니다. 말처럼 'PagingHelperID'
- 쓰기 쿼리 :이 어려운 주문하게됩니다
SELECT columns FROM viewname WHERE PagingHelperID BETWEEN startindex AND stopindex
, 당신은 데이터를 retreive하고자하는 모든 주문에 대해 서로 다른 견해를해야합니다.
또한 데이터베이스에 따라 쿼리 할 때 SQL을 "다시 작성"하고 다시 작성기에 대한 고유 한 메서드를 정의 할 수 있지만 "좋은"방법이 없다고 생각합니다.
오른쪽. 나는 어떤 종류의 데이터베이스 탐지도 피하고자한다. – pugmarx
테이블 예에 고유 키가있는 경우 ...
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 (사용하는 경우 '< =')
참고 :이 상관 하위 쿼리를 포함으로, 성능은 내가 모든 제품이를 달성하기 위해 다른 구문을 다음과 생각이 매우 큰 테이블에 대한 문제 ...
고유 키가 GUID 또는 다른 비 순차적 데이터 인 경우 어떻게해야합니까? –
고유 키를 사용하면 레코드를 식별 할 수 있습니다. "Top"의 의미를 정의하는 "정렬"이 다른 다른 논리를 기반으로하는 경우 하위 쿼리는 해당 레코드를 "계산"하도록 작성됩니다 논리 ... 그렇다면 유일한 문제는 N 값이 여러 인스턴스가있는 특정 값에서 발생하는 경우입니다 (레코드 8, 9, 10 및 11 모두 동일한 값을 갖는 경우 가능합니다. 상위 10 개) –
수 있습니다. 아래의 유사한 질문을 찾아보십시오. Is there an ANSI SQL alternative to the MYSQL LIMIT keyword?
큰 문제는 이것을 살펴본 후 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)
(최소한 TOP n 절을 사용할 때 SQL 서버에서)보기를 강제해야한다는 제한 사항이 있습니다. – Tomalak
그리고 다른 DBMS는 개념을 지원하지만 다른 표기법을 사용합니다. –
또한 일부 DBMS는 뷰에서 ORDER BY 절을 허용하지 않습니다. –