데이터베이스 테이블에서 n 번째 행 을 선택하는 (이상적으로) 데이터베이스 불가지론 적 방법을 배우고 싶습니다 . 다음 데이터베이스의 고유 기능을 사용하여 이것이 어떻게 달성 될 수 있는지 보는 것도 흥미로울 것입니다.
- SQL 서버
- MySQL
- PostgreSQL
- SQLite
- 신탁
현재 SQL Server 2005에서 다음과 같은 작업을 수행하고 있지만 다른 더 독립적 인 접근 방식을 보는 데 관심이 있습니다.
WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000
위의 SQL에 대한 크레딧 : Firoz Ansari의 웹 로그
업데이트 : SQL 표준에 관한 Troels Arvin의 답변을 참조하십시오 . 트롤, 우리가 인용 할 수있는 링크가 있습니까?
답변
표준의 선택적 부분 에서이 작업을 수행하는 방법이 있지만 많은 데이터베이스가 자체 작업 방식을 지원합니다.
이것과 다른 것들에 대해 이야기하는 정말 좋은 사이트는 http://troels.arvin.dk/db/rdbms/#select-limit 입니다.
기본적으로 PostgreSQL 및 MySQL은 비표준을 지원합니다.
SELECT...
LIMIT y OFFSET x
Oracle, DB2 및 MSSQL은 표준 윈도우 기능을 지원합니다.
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
columns
FROM tablename
) AS foo
WHERE rownumber <= n
(위의 DB를 사용하지 않기 때문에 위의 사이트에서 방금 복사했습니다)
업데이트 : PostgreSQL 8.4부터 표준 윈도우 기능이 지원되므로 PostgreSQL에서도 두 번째 예제가 작동 할 것으로 예상됩니다.
업데이트 : SQLite는 2018-09-15의 버전 3.25.0에서 창 기능 지원을 추가 했으므로 두 형식 모두 SQLite에서 작동합니다.
답변
PostgreSQL은 SQL 표준에 의해 정의 된 윈도우 기능 을 지원 하지만 어색하므로 대부분의 사람들은 (비표준) LIMIT
/OFFSET
:
SELECT
*
FROM
mytable
ORDER BY
somefield
LIMIT 1 OFFSET 20;
이 예는 21 번째 행을 선택합니다. OFFSET 20
Postgres에 처음 20 개의 레코드를 건너 뛰라고 지시합니다. ORDER BY
조항을 지정하지 않으면 어떤 레코드를 되 찾을 것이라는 보장이 없으며, 거의 유용하지 않습니다.
답변
나머지는 확실하지 않지만 SQLite와 MySQL에는 “기본”행 순서가 없습니다. 이 두 방언에서 최소한 다음 스 니펫은 추가 된 날짜 / 시간을 기준으로 정렬하여 the_table에서 15 번째 항목을 가져옵니다.
SELECT * FROM the_table ORDER BY added DESC LIMIT 1,15
(물론 DATETIME 필드를 추가하고 항목을 추가 한 날짜 / 시간으로 설정해야합니다.)
답변
SQL 2005 이상에는이 기능이 내장되어 있습니다. ROW_NUMBER () 함수를 사용하십시오. << 이전 및 다음 >> 스타일 브라우징 기능이있는 웹 페이지에 적합합니다.
통사론:
SELECT
*
FROM
(
SELECT
ROW_NUMBER () OVER (ORDER BY MyColumnToOrderBy) AS RowNum,
*
FROM
Table_1
) sub
WHERE
RowNum = 23
답변
나는 이것이 비효율적이라고 생각하지만 아주 간단한 접근법이며, 시도한 작은 데이터 세트에서 작동했습니다.
select top 1 field
from table
where field in (select top 5 field from table order by field asc)
order by field desc
이것은 다섯 번째 항목을 얻고 두 번째 최상위 숫자를 변경하여 다른 n 번째 항목을 얻습니다
SQL 서버에서만 (제 생각에는) ROW_NUMBER ()를 지원하지 않는 이전 버전에서 작동해야합니다.
답변
1 작은 변화 : n 대신 n-1.
select *
from thetable
limit n-1, 1
답변
SQL Server에서 확인하십시오.
Select top 10 * From emp
EXCEPT
Select top 9 * From emp
이것은 당신에게 emp 테이블의 10 번째 줄을 줄 것입니다!