[SQL] 어떻게 SQL 데이터베이스 테이블에서 n 번째 행을 선택하려면?
SQL어떻게 SQL 데이터베이스 테이블에서 n 번째 행을 선택하려면?
나는 데이터베이스 테이블에서 n 번째 행을 선택의 일부 (이상적) 데이터베이스 무신론자 방법을 학습에 관심이 있어요. 또한 이것은 다음 데이터베이스의 기본 기능을 사용하여 달성 할 수있는 방법을보고 재미있을 것입니다 :
나는 현재 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 안사의 웹 로그
업데이트 : SQL 표준에 대한 참조 Troels 아빈의 대답. Troels, 당신은 우리가 인용 수있는 링크를 가지고 있나요?
해결법
-
==============================
1.이 표준의 옵션 부분에서이 일을하는 방법이 있지만, 데이터베이스의 많은 그 일을 자신의 방법을 지원합니다.
이 표준의 옵션 부분에서이 일을하는 방법이 있지만, 데이터베이스의 많은 그 일을 자신의 방법을 지원합니다.
이것과 다른 것들에 대해 이야기 정말 좋은 사이트는 http://troels.arvin.dk/db/rdbms/#select-limit입니다.
기본적으로, PostgreSQL을하고 MySQL은 비 표준 지원
SELECT... LIMIT y OFFSET x
오라클, 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는 추가 윈도우 함수는 두 형태 SQLite는의도 일 때문에 2018년 9월 15일에 버전 3.25.0에서 지원합니다.
-
==============================
2.PostgreSQL의 SQL 표준에 의해 정의 된 기능을 윈도 지원하지만, 그래서 대부분의 사람들이 어색하게 사용할 수있는 거 (비표준) LIMIT는 / OFFSET :
PostgreSQL의 SQL 표준에 의해 정의 된 기능을 윈도 지원하지만, 그래서 대부분의 사람들이 어색하게 사용할 수있는 거 (비표준) LIMIT는 / OFFSET :
SELECT * FROM mytable ORDER BY somefield LIMIT 1 OFFSET 20;
이 예에서는, 21 행을 선택한다. OFFSET (20)는 처음 20 개 기록을 건너 포스트 그레스을 말하고있다. 당신이 ORDER BY 절을 지정하지 않으면, 거의 유용하다 다시 얻을 것이다 기록 보장은 없습니다.
-
==============================
3.나는 나머지의 대한 모르겠지만, SQLite는과 MySQL이 어떤 "기본"행 순서가없는 것을 알고있다. 그 두 방언에서, 적어도 다음 코드는 추가 된 날짜 / 시간으로 정렬, the_table에서 15 항목을 잡고 :
나는 나머지의 대한 모르겠지만, SQLite는과 MySQL이 어떤 "기본"행 순서가없는 것을 알고있다. 그 두 방언에서, 적어도 다음 코드는 추가 된 날짜 / 시간으로 정렬, the_table에서 15 항목을 잡고 :
SELECT * FROM the_table ORDER BY added DESC LIMIT 1,15
(... 물론, 당신은 추가 DATETIME 필드가 필요 했어, 그리고 항목이 추가 된 날짜 / 시간으로 설정)
-
==============================
4.위의 SQL 2005와 내장이 기능이 있습니다. ROW_NUMBER () 함수를 사용합니다. 그것은 << 이전 및 다음 >> 스타일의 브라우징 웹 페이지에 대한 우수 :
위의 SQL 2005와 내장이 기능이 있습니다. ROW_NUMBER () 함수를 사용합니다. 그것은 << 이전 및 다음 >> 스타일의 브라우징 웹 페이지에 대한 우수 :
통사론:
SELECT * FROM ( SELECT ROW_NUMBER () OVER (ORDER BY MyColumnToOrderBy) AS RowNum, * FROM Table_1 ) sub WHERE RowNum = 23
-
==============================
5.나는이 격렬하게 비효율적이다하지만 난 그것을 시도하는 작은 데이터 세트에 근무 아주 간단한 방법이다 생각한다.
나는이 격렬하게 비효율적이다하지만 난 그것을 시도하는 작은 데이터 세트에 근무 아주 간단한 방법이다 생각한다.
select top 1 field from table where field in (select top 5 field from table order by field asc) order by field desc
이것은 5 항목을 얻을 다른 n 번째 아이템을 얻을 수있는 두 번째 상위 번호를 변경하는 것
SQL 서버 전용 (내 생각)하지만 ROW_NUMBER를 지원하지 않는 이전 버전에서 작동한다 ().
-
==============================
6.1 작은 변화 : N-1 N 대신.
1 작은 변화 : N-1 N 대신.
select * from thetable limit n-1, 1
-
==============================
7.SQL 서버에 확인 :
SQL 서버에 확인 :
Select top 10 * From emp EXCEPT Select top 9 * From emp
이것은 당신에게 EMP 테이블의 10 행을 줄 것이다!
-
==============================
8.답변 중 일부는 주장 것과는 반대로, SQL 표준이 주제에 대해 침묵하지 않습니다.
답변 중 일부는 주장 것과는 반대로, SQL 표준이 주제에 대해 침묵하지 않습니다.
SQL 이후 : 2003, 당신은 행과 한계 결과 집합을 건너 뛰려면 "윈도우 기능"을 사용할 수 있었다.
그리고 SQL에 2008, 약간 간단한 방법은 사용하여 추가했다 OFFSET 스킵 행 FIRST의 N 행만을 FETCH
내가 ISO를했다 그렇다면, 나는 이미 오히려 큰 표준의 그것을 유지했을 2008 년의 또한 정말 필요했다 : 개인적으로, 나는 SQL이 있다고 생각하지 않습니다.
-
==============================
9.우리는 MSSQL 2000 년 사업에 사용하는 경우, 우리는 우리가 "트리플 플립"라는 것을했다 :
우리는 MSSQL 2000 년 사업에 사용하는 경우, 우리는 우리가 "트리플 플립"라는 것을했다 :
EDITED
DECLARE @InnerPageSize int DECLARE @OuterPageSize int DECLARE @Count int SELECT @Count = COUNT(<column>) FROM <TABLE> SET @InnerPageSize = @PageNum * @PageSize SET @OuterPageSize = @Count - ((@PageNum - 1) * @PageSize) IF (@OuterPageSize < 0) SET @OuterPageSize = 0 ELSE IF (@OuterPageSize > @PageSize) SET @OuterPageSize = @PageSize DECLARE @sql NVARCHAR(8000) SET @sql = 'SELECT * FROM ( SELECT TOP ' + CAST(@OuterPageSize AS nvarchar(5)) + ' * FROM ( SELECT TOP ' + CAST(@InnerPageSize AS nvarchar(5)) + ' * FROM <TABLE> ORDER BY <column> ASC ) AS t1 ORDER BY <column> DESC ) AS t2 ORDER BY <column> ASC' PRINT @sql EXECUTE sp_executesql @sql
그것은 우아하지 않았다, 그리고 빨리 아니었지만, 그것은했다.
-
==============================
10.정상에서 N 번째의 레코드를 선택
정상에서 N 번째의 레코드를 선택
SELECT * FROM ( SELECT ID, NAME, ROW_NUMBER() OVER(ORDER BY ID) AS ROW FROM TABLE ) AS TMP WHERE ROW = n
아래에서, N 번째의 레코드를 선택
SELECT * FROM ( SELECT ID, NAME, ROW_NUMBER() OVER(ORDER BY ID DESC) AS ROW FROM TABLE ) AS TMP WHERE ROW = n
-
==============================
11.신탁:
신탁:
select * from (select foo from bar order by foo) where ROWNUM = x
-
==============================
12.오라클 12C에서, 당신은 ORDER BY와 OFFSET..FETCH..ROWS 옵션을 사용할 수 있습니다
오라클 12C에서, 당신은 ORDER BY와 OFFSET..FETCH..ROWS 옵션을 사용할 수 있습니다
예를 들어, 위에서 세번째 기록을 얻을 수 있습니다 :
SELECT * FROM sometable ORDER BY column_name OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY;
-
==============================
13.여기에 귀하의 혼란의 빠른 솔루션입니다.
여기에 귀하의 혼란의 빠른 솔루션입니다.
SELECT * FROM table ORDER BY `id` DESC LIMIT N, 1
여기에 N = 3 등을 작성하여 N = 1, 넷째 마지막으로, 두 번째 마지막 N = 0을 작성하여 마지막 행을 얻을 수 있습니다.
이 인터뷰를 통해 매우 일반적인 질문이 매우 간단하고 그것입니다.
또한 당신은 금액, ID 또는 일부 숫자 정렬 순서 유 MySQL은 CAST 기능 갈 것보다를합니다.
SELECT DISTINCT (`amount`) FROM cart ORDER BY CAST( `amount` AS SIGNED ) DESC LIMIT 4 , 1
여기서 N = 4를 충전함으로써 당신은 쇼핑 카트에 담기 테이블에서 최고 금액의 다섯 번째 마지막 기록을 얻을 수있을 것입니다. 당신은 당신의 필드와 테이블 이름에 맞게 및 솔루션을 마련 할 수 있습니다.
-
==============================
14.더하다:
더하다:
LIMIT n,1
그 결과 N에서 시작하여 하나 개의 결과로 결과를 제한합니다.
-
==============================
15.당신은 MSSQL의 모든 10 행을 선택하려는 경우 예를 들어, 당신은 사용할 수 있습니다;
당신은 MSSQL의 모든 10 행을 선택하려는 경우 예를 들어, 당신은 사용할 수 있습니다;
SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY ColumnName1 ASC) AS rownumber, ColumnName1, ColumnName2 FROM TableName ) AS foo WHERE rownumber % 10 = 0
그냥 여기 당신이 원하는 번호를 MOD 변경 수 (10)을.
-
==============================
16.SQL Server의 경우, 행 번호로 이동하는 일반적인 방법은 같은 것입니다 :
SQL Server의 경우, 행 번호로 이동하는 일반적인 방법은 같은 것입니다 :
SET ROWCOUNT @row --@row = the row number you wish to work on.
예를 들면 :
set rowcount 20 --sets row to 20th row select meat, cheese from dbo.sandwich --select columns from table at 20th row set rowcount 0 --sets rowcount back to all rows
이것은 20 행의 정보를 반환합니다. 이후에 행 개수 0에 넣어해야합니다.
-
==============================
17.LIMIT N, 1 MS SQL 서버에서 작동하지 않습니다. 난 그냥 구문을 지원하지 않는 유일한 주요 데이터베이스에 대해 생각합니다. 그렇게 널리 될 것을 지원하고 있지만 공정을하기 위해, 그것은 SQL 표준의 일부가 아닙니다. SQL 서버 LIMIT를 제외한 모든에서 잘 작동합니다. SQL 서버의 경우, 나는 우아한 해결책을 찾을 수 없어.
LIMIT N, 1 MS SQL 서버에서 작동하지 않습니다. 난 그냥 구문을 지원하지 않는 유일한 주요 데이터베이스에 대해 생각합니다. 그렇게 널리 될 것을 지원하고 있지만 공정을하기 위해, 그것은 SQL 표준의 일부가 아닙니다. SQL 서버 LIMIT를 제외한 모든에서 잘 작동합니다. SQL 서버의 경우, 나는 우아한 해결책을 찾을 수 없어.
-
==============================
18.여기에 정렬 / 동적 페이징을 허용 나는 최근 오라클에 대한 쓴 SPROC의 일반 버전입니다 - HTH
여기에 정렬 / 동적 페이징을 허용 나는 최근 오라클에 대한 쓴 SPROC의 일반 버전입니다 - HTH
-- p_LowerBound = first row # in the returned set; if second page of 10 rows, -- this would be 11 (-1 for unbounded/not set) -- p_UpperBound = last row # in the returned set; if second page of 10 rows, -- this would be 20 (-1 for unbounded/not set) OPEN o_Cursor FOR SELECT * FROM ( SELECT Column1, Column2 rownum AS rn FROM ( SELECT tbl.Column1, tbl.column2 FROM MyTable tbl WHERE tbl.Column1 = p_PKParam OR tbl.Column1 = -1 ORDER BY DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 1, Column1, 'X'),'X'), DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 1, Column1, 'X'),'X') DESC, DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate), DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate) DESC )) WHERE (rn >= p_lowerBound OR p_lowerBound = -1) AND (rn <= p_upperBound OR p_upperBound = -1);
-
==============================
19.하지만 실제로는, 모든 처음부터 좋은 데이터베이스 디자인이 정말 그냥 응접실 트릭 아닌가요? 몇 번 나는 빠른 보고서를 만들기 위해 쿼리 오프 단순한 하나였다 다음과 같은 기능을 필요로했다. 실제 작업의 경우, 이와 같은 사용 트릭 문제를 초대합니다. 특정 행을 선택하는 것은 필요한 경우 단지 연속 값을 가진 열이 그것으로 할 수.
하지만 실제로는, 모든 처음부터 좋은 데이터베이스 디자인이 정말 그냥 응접실 트릭 아닌가요? 몇 번 나는 빠른 보고서를 만들기 위해 쿼리 오프 단순한 하나였다 다음과 같은 기능을 필요로했다. 실제 작업의 경우, 이와 같은 사용 트릭 문제를 초대합니다. 특정 행을 선택하는 것은 필요한 경우 단지 연속 값을 가진 열이 그것으로 할 수.
-
==============================
20.SQL 서버의 경우, 다음 표를주는에서 첫 번째 행을 반환합니다.
SQL 서버의 경우, 다음 표를주는에서 첫 번째 행을 반환합니다.
declare @rowNumber int = 1; select TOP(@rowNumber) * from [dbo].[someTable]; EXCEPT select TOP(@rowNumber - 1) * from [dbo].[someTable];
이 같은 뭔가 값을 통해 당신은 할 수 루프 :
WHILE @constVar > 0 BEGIN declare @rowNumber int = @consVar; select TOP(@rowNumber) * from [dbo].[someTable]; EXCEPT select TOP(@rowNumber - 1) * from [dbo].[someTable]; SET @constVar = @constVar - 1; END;
-
==============================
21.사이베이스 SQL의 어느 곳에서 :
사이베이스 SQL의 어느 곳에서 :
SELECT TOP 1 START AT n * from table ORDER BY whatever
순서에 따라 또는 그것의 의미를 잊지 마세요.
-
==============================
22.T-SQL은 - 테이블에서 N 번째 RecordNumber 선택
T-SQL은 - 테이블에서 N 번째 RecordNumber 선택
select * from (select row_number() over (order by Rand() desc) as Rno,* from TableName) T where T.Rno = RecordNumber Where RecordNumber --> Record Number to Select TableName --> To be Replaced with your Table Name
의 경우 예를 들어, (5)에게 테이블 직원에서 일 레코드를 선택하는 쿼리가 있어야한다
select * from (select row_number() over (order by Rand() desc) as Rno,* from Employee) T where T.Rno = 5
-
==============================
23.
SELECT * FROM emp a WHERE n = (SELECT COUNT( _rowid) FROM emp b WHERE a. _rowid >= b. _rowid);
-
==============================
24.
SELECT top 1 * FROM table_name WHERE column_name IN ( SELECT top N column_name FROM TABLE ORDER BY column_name ) ORDER BY column_name DESC
나는 N 번째 행을 찾기 위해이 쿼리를 작성했습니다. 이 쿼리를 예로들 수
SELECT top 1 * FROM Employee WHERE emp_id IN ( SELECT top 7 emp_id FROM Employee ORDER BY emp_id ) ORDER BY emp_id DESC
-
==============================
25.믿을 수없는이 일을 실행하는 SQL 엔진을 찾을 수 ...
믿을 수없는이 일을 실행하는 SQL 엔진을 찾을 수 ...
WITH sentence AS (SELECT stuff, row = ROW_NUMBER() OVER (ORDER BY Id) FROM SentenceType ) SELECT sen.stuff FROM sentence sen WHERE sen.row = (ABS(CHECKSUM(NEWID())) % 100) + 1
-
==============================
26.내가처럼 당신은 캐시를 사용하는 경우에 아무것도 공상, 특별한 기능, ...
내가처럼 당신은 캐시를 사용하는 경우에 아무것도 공상, 특별한 기능, ...
SELECT TOP 1 * FROM ( SELECT TOP n * FROM <table> ORDER BY ID Desc ) ORDER BY ID ASC
당신은 ID 열 또는 당신이 신뢰할 수있는 날짜 스탬프 열이 있음을 감안할 때.
-
==============================
27.이것은 내가 DB2 SQL 내에서 할 거라고하는 방법이다, 나는 RRN이 (상대 레코드 수) O / S에 의해 테이블에 저장된다 믿는다
이것은 내가 DB2 SQL 내에서 할 거라고하는 방법이다, 나는 RRN이 (상대 레코드 수) O / S에 의해 테이블에 저장된다 믿는다
SELECT * FROM ( SELECT RRN(FOO) AS RRN, FOO.* FROM FOO ORDER BY RRN(FOO)) BAR WHERE BAR.RRN = recordnumber
-
==============================
28.
select * from (select * from ordered order by order_id limit 100) x order by x.order_id desc limit 1;
첫 번째 선택 100 오름차순 순서로 행과 다음 두 번 데이터를 액세스 할 때 이것은 매우 비싼 성명 그러나 1로 하강 및 제한에 주문하여 마지막 행을 선택합니다.
-
==============================
29.그것은 효율적으로, 당신은 그 위치에있는 행을 선택할 수) 0 적은 데이터베이스 레코드의 수보다 하나와 2 사이의 임의의 숫자를 생성) 한 필요 나 그 보인다. 일반적으로 당신이 원하는 얼마나 많은 행을 건너 뛰고 얼마나 많은 행을 지정하지만, 서로 다른 데이터베이스 다르게 이루어집니다 - 불행하게도, 다른 데이터베이스는 서로 다른 난수 생성기 및 결과 세트의 위치에서 행을 선택하는 여러 가지 방법이있다. 여기에 SQLite는 나를 위해 작동하는 무언가가있다 :
그것은 효율적으로, 당신은 그 위치에있는 행을 선택할 수) 0 적은 데이터베이스 레코드의 수보다 하나와 2 사이의 임의의 숫자를 생성) 한 필요 나 그 보인다. 일반적으로 당신이 원하는 얼마나 많은 행을 건너 뛰고 얼마나 많은 행을 지정하지만, 서로 다른 데이터베이스 다르게 이루어집니다 - 불행하게도, 다른 데이터베이스는 서로 다른 난수 생성기 및 결과 세트의 위치에서 행을 선택하는 여러 가지 방법이있다. 여기에 SQLite는 나를 위해 작동하는 무언가가있다 :
select * from Table limit abs(random()) % (select count(*) from Words), 1;
그것은 한계 절에 하위 쿼리를 사용할 수있는에 의존 않습니다 (SQLite는에 LIMIT <건너 뛸 RECS>는,
), 특히 효율적인해야 테이블에 레코드의 수를 선택하면 데이터베이스의의 일부가되는 메타 데이터는하지만 데이터베이스의 구현에 따라 달라집니다. 또한, 쿼리가 실제로 N 번째 기록을 검색하기 전에 결과 집합을 구축 할 것인지는 모르겠지만, 나는 그것이 필요하지 않는 것을 희망한다. 내가 절에 "에 의해 순서"를 지정하고 있지 않다 있습니다. 데이터베이스가 결과 집합을 구축하지 않고 데이터베이스 자체에서 N 번째 기록을 얻을 수없는 경우 빠른 수 있습니다 인덱스에서 N 번째 기록하기 -이 인덱스를해야합니다 기본 키, 같은 "에 의해 순서"더 나은을 수 있습니다 . -
==============================
30.내가 SQL 서버에 대해이 기사에 본 가장 적합한 답
내가 SQL 서버에 대해이 기사에 본 가장 적합한 답
WITH myTableWithRows AS ( SELECT (ROW_NUMBER() OVER (ORDER BY myTable.SomeField)) as row,* FROM myTable) SELECT * FROM myTableWithRows WHERE row = 3
from https://stackoverflow.com/questions/16568/how-to-select-the-nth-row-in-a-sql-database-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 된 PreparedStatement 피하거나 방지 SQL 주입을합니까? (0) | 2020.03.11 |
---|---|
[SQL] 각 범주에 대한 상위 10 개의 레코드를 선택 (0) | 2020.03.11 |
[SQL] SQL 서버에서 날짜 시간 대 DATETIME2 (0) | 2020.03.11 |
[SQL] MySQL의 : 테이블을 만들 수 없습니다 (errno를 : 150) (0) | 2020.03.11 |
[SQL] 어떻게 오라클의 쉼표로 구분 된 목록으로 여러 행을 결합 할 수 있습니다? [복제] (0) | 2020.03.11 |