SQL डेटाबेस तालिका में nth रो का चयन कैसे करें?


399

मैं डेटाबेस तालिका से n वें पंक्ति का चयन करने के लिए कुछ (आदर्श रूप से) डेटाबेस अज्ञेय तरीके सीखने में दिलचस्पी रखता हूं । यह देखना भी दिलचस्प होगा कि निम्नलिखित डेटाबेस की मूल कार्यक्षमता का उपयोग करके इसे कैसे प्राप्त किया जा सकता है:

  • एस क्यू एल सर्वर
  • माई एसक्यूएल
  • 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

उपरोक्त एसक्यूएल का श्रेय: फिरोज अंसारी की वेबलॉग

अपडेट: एसक्यूएल मानक के बारे में ट्रॉल्स अरविन का जवाब देखें । Troels, क्या आपको कोई लिंक मिला है जिसे हम उद्धृत कर सकते हैं?


3
हाँ। यहाँ ISO SQL मानक के बारे में जानकारी के लिए एक लिंक है: troels.arvin.dk/db/rdbms/links/#standards
Troels Arvin

13
केवल यह बताने के लिए कि किसी संबंध की परिभाषा के अनुसार, किसी तालिका में पंक्तियों में क्रम नहीं होता है, इसलिए किसी तालिका में Nth पंक्ति का चयन नहीं किया जा सकता है। जो चुना जा सकता है वह एक पंक्ति-सेट (शेष) द्वारा क्वेरी में दी गई पंक्ति-पंक्ति में Nth पंक्ति है, जो कि आपके उदाहरण और सभी उत्तर को पूरा करती है। अधिकांश के लिए यह सिर्फ शब्दार्थ हो सकता है, लेकिन यह प्रश्न की अंतर्निहित समस्या की ओर इशारा करता है। यदि आपको वापस जाने की आवश्यकता है OrderNo N, तो तालिका में एक क्रम क्रमांक कॉलम शुरू करें और एक नया क्रम बनाने पर एक स्वतंत्र अनुक्रम जनरेटर से उत्पन्न करें।
दामिर सुद्रेविक

2
SQL मानक विकल्प को परिभाषित करता है offset x fetch first y rows only। वर्तमान में (कम से कम) Postgres, Oracle12, DB2 द्वारा समर्थित है।
a_horse_with_no_name

जवाबों:


349

मानक के वैकल्पिक भागों में ऐसा करने के तरीके हैं, लेकिन बहुत सारे डेटाबेस इसे करने के अपने तरीके का समर्थन करते हैं।

एक बहुत अच्छी साइट जो इस और अन्य चीजों के बारे में बात करती है वह है 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

(जो मैंने अभी ऊपर लिंक की गई साइट से कॉपी किया है क्योंकि मैं कभी भी उन डीबी का उपयोग नहीं करता हूं)

अद्यतन: PostgreSQL 8.4 के रूप में मानक विंडोिंग फ़ंक्शंस का समर्थन किया जाता है, इसलिए PostgreSQL के लिए भी दूसरे उदाहरण से काम करने की अपेक्षा करें।

अद्यतन: SQLite जोड़ा विंडो फ़ंक्शन 2018-09-15 को संस्करण 3.25.0 में समर्थन करता है, इसलिए दोनों रूप SQLite में भी काम करते हैं।


3
MySQL OFFSET और LIMIT सिंटैक्स का भी उपयोग करता है। फायरबर्ड FIRST और SKIP कीवर्ड का उपयोग करता है, लेकिन उन्हें SELECT के ठीक बाद रखा जाता है।
डग

7
नहीं होना चाहिए कि WHERE rownumber = nकेवल nth पंक्ति प्राप्त करने के लिए?
स्टीव बेनेट

MySQL संस्करण 8 के बाद से विंडो कार्यों का समर्थन करता है। 10.2 संस्करण के बाद से MariaDB
पॉल स्पीगल

101

PostgreSQL समर्थन कार्यों विंडोइंग के रूप में एसक्यूएल मानक द्वारा परिभाषित है, लेकिन वे अजीब है, तो ज्यादातर लोगों का उपयोग करें (गैर मानक) LIMIT/OFFSET :

SELECT
    *
FROM
    mytable
ORDER BY
    somefield
LIMIT 1 OFFSET 20;

यह उदाहरण 21 वीं पंक्ति का चयन करता है। OFFSET 20बता रहा है कि पोस्टग्रेज्स पहले 20 रिकॉर्ड्स को छोड़ सकते हैं। यदि आप कोई ORDER BYखंड निर्दिष्ट नहीं करते हैं , तो कोई गारंटी नहीं है कि कौन सा रिकॉर्ड आपको वापस मिलेगा, जो शायद ही उपयोगी है।


31

मैं किसी भी बाकी के बारे में निश्चित नहीं हूं, लेकिन मुझे पता है कि SQLite और MySQL के पास कोई "डिफ़ॉल्ट" पंक्ति क्रम नहीं है। उन दो बोलियों में, कम से कम, निम्नलिखित स्निपेट the_table से 15 वीं प्रविष्टि को पकड़ता है, तिथि / समय के अनुसार इसे जोड़ा गया था:

SELECT * FROM the_table ORDER BY added DESC LIMIT 1,15

(बेशक, आपको एक अतिरिक्त DATETIME फ़ील्ड की आवश्यकता होगी, और इसे उस दिनांक / समय पर सेट करें जब प्रविष्टि जोड़ी गई थी ...)


यह इनलाइन ऑफसेट मान के साथ क्वेरी को सीमित करने का सबसे अच्छा तरीका लगता है। लेकिन क्या हमें यहाँ 0,14 का उपयोग नहीं करना चाहिए? 1,15 पहली पंक्ति छोड़ देंगे।
ग्लैडिएटर

हालांकि 15 का क्या मतलब है? मुझे पता है 1 एक रिकॉर्ड पाने के लिए कहता है। अल्पविराम उदाहरण में इस्तेमाल नहीं किया है मैं बाहर की जाँच की 1keydata.com/sql/sql-limit.html
committedandroider

1
दरअसल, यहां से php.about.com/od/mysqlcommands/g/Limit_sql.htm , अगर आप 15 वीं प्रविष्टि को हथियाना चाहते थे तो आप 14 को नहीं कर सकते, 1 (0th पहला तत्व है, लंबाई का 1
कमिट्रांडरर

यह शॉल्यूड का चयन करें * से the_table ऑर्डर द्वारा जोड़ा गया DESC LIMIT 15,1
जैरीगोपाल

25

SQL 2005 और इसके बाद के संस्करण में यह सुविधा अंतर्निहित है। ROW_NUMBER () फ़ंक्शन का उपयोग करें। यह वेब पृष्ठों के लिए उत्कृष्ट है << Prev और अगला >> शैली ब्राउज़िंग:

वाक्य - विन्यास:

SELECT
    *
FROM
    (
        SELECT
            ROW_NUMBER () OVER (ORDER BY MyColumnToOrderBy) AS RowNum,
            *
        FROM
            Table_1
    ) sub
WHERE
    RowNum = 23

मैं इस समाधान को पसंद करता हूं, क्योंकि यह आगे सीधे लगता है।
फॉक्सएका

18

मुझे संदेह है कि यह बेतहाशा अक्षम है, लेकिन काफी सरल दृष्टिकोण है, जो एक छोटे डेटासेट पर काम करता है जिसे मैंने कोशिश की थी।

select top 1 field
from table
where field in (select top 5 field from table order by field asc)
order by field desc

यह 5 वां आइटम मिलेगा, दूसरा शीर्ष नंबर बदलकर एक अलग nth आइटम मिलेगा

SQL सर्वर केवल (मुझे लगता है) लेकिन पुराने संस्करणों पर काम करना चाहिए जो ROW_NUMBER () का समर्थन नहीं करते हैं।


मैं इसे ROW_NUMBER के रूप में उपयोग करने जा रहा हूं () SQL 2000 में काम नहीं करता है (हां, हमारे पास अभी भी SQL 2000 पर एक ग्राहक है) विशेष रूप से, मैं '5' को एक लूप के इटेरिएटर वेरिएबल से बदलने जा रहा हूं और उपयोग करता हूं बदले में तालिका की प्रत्येक पंक्ति को कॉपी और संशोधित करना। हो सकता है कि कोई व्यक्ति इस टिप्पणी को देखेगा और इसे उपयोगी
समझेगा


14

इसे SQL सर्वर पर सत्यापित करें:

Select top 10 * From emp 
EXCEPT
Select top 9 * From emp

यह आपको 10 वीं ROW की एम्पायर टेबल देगा!


आपने पहले ही इस प्रश्न का उत्तर यहां दे दिया है। उस उत्तर को हटा दें जो आपको लगता है कि सही नहीं है। यदि आपको लगता है कि दोनों उत्तर सही हैं, तो दोनों उत्तरों को एक ही स्थान पर पोस्ट करें
SpringLearner

11

कुछ उत्तरों के दावे के विपरीत, SQL मानक इस विषय के बारे में चुप नहीं है।

SQL: 2003 के बाद से, आप पंक्तियों को छोड़ने और परिणाम सेट को सीमित करने के लिए "विंडो फ़ंक्शन" का उपयोग करने में सक्षम हैं।

और SQL: 2008 में, थोड़ा सरल दृष्टिकोण का उपयोग करके जोड़ा गया था
OFFSET skip ROWS FETCH FIRST n ROWS ONLY

व्यक्तिगत रूप से, मुझे नहीं लगता कि SQL: 2008 के जुड़ाव की वास्तव में आवश्यकता थी, इसलिए यदि मैं ISO था, तो मैंने इसे पहले से ही बड़े मानक से बाहर रखा होगा।


यह अच्छा है कि एक मानक है, हालांकि, लोगों को अपने जीवन को आसान बनाना पसंद है, और मानक तरीके से सामान करने के लिए Microsoft का इतना अच्छा :) :)
user230910

7

जब हम MSSQL 2000 में काम करते थे, तो हमने वही किया जिसे हमने "ट्रिपल-फ्लिप" कहा:

संपादित

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

यह सुरुचिपूर्ण नहीं था, और यह तेज़ नहीं था, लेकिन इसने काम किया।


मान लें कि आपकी 25 पंक्तियाँ हैं और आप चाहते हैं कि 10 पंक्ति के तीसरे पृष्ठ को पेजेज़ करें, अर्थात पंक्तियाँ 212। अंतरतम क्वेरी को शीर्ष 30 पंक्तियाँ (पंक्तियाँ 1-25) मिलती हैं। मध्य क्वेरी को अंतिम 10 पंक्तियाँ (पंक्तियाँ 25-16) मिलती हैं। बाहरी क्वेरी उन्हें फिर से व्यवस्थित करती है और 16-25 पंक्तियों को वापस करती है। यह स्पष्ट रूप से गलत है यदि आप पंक्तियाँ चाहते थे।
बिल कारविन

यदि हम एक मध्य पृष्ठ चाहते हैं तो यह काम नहीं करता है। मान लें कि हमारी 25 पंक्तियाँ हैं और हम दूसरा पृष्ठ चाहते हैं, अर्थात पंक्तियाँ 11-20। आंतरिक क्वेरी को शीर्ष 2 * 10 = 20 पंक्तियाँ, या पंक्तियाँ 1-20 मिलती हैं। मध्य क्वेरी को अंतिम 15 पंक्तियाँ मिलती हैं: 25 - ((2-1) * 10) = 15, जो पंक्तियों को 20-6 तक पहुंचाता है। अंतिम क्वेरी क्रम को उलट देती है और 6-20 पंक्तियों को वापस करती है। यह तकनीक तब तक काम नहीं करती है, जब तक कि पंक्तियों की कुल संख्या आपके इच्छित पृष्ठ आकार की एक बहु न हो।
बिल कार्विन

शायद सबसे अच्छा निष्कर्ष यह है कि हमें किसी भी शेष एमएस SQL ​​सर्वर 2000 इंस्टेंस को अपग्रेड करना चाहिए। :-) यह लगभग 2012 है, और यह समस्या कई वर्षों से बेहतर तरीके से हल हो गई है!
बिल कार्विन

@ बिल कार्विन: गणना के IF / ELSE IFनीचे के ब्लॉकों पर ध्यान दें OuterPageSize- पृष्ठ 1 और 2 पर, वे OuterPageSizeमान को वापस 10. पर छोड़ देंगे । पेज 3 (पंक्तियों को 212) पर गणना सही ढंग से 5 पर वापस आ जाएगी, और सभी पृष्ठों पर 4 और अधिक से अधिक, गणना से नकारात्मक परिणाम को 0 से बदल दिया जाएगा (हालांकि यह शायद उस बिंदु पर तुरंत एक खाली डेटा पंक्ति वापस करने के लिए तेज होगा)।
एडम वी

ओह अब मैं देख रहा हूं। ठीक है, मैं अपनी राय के साथ खड़ा हूं कि आज एमएस SQL ​​सर्वर 2000 का उपयोग करना परेशानी के लायक नहीं है।
बिल करविन

6

एस क्यू एल सर्वर


ऊपर से 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

5

आकाशवाणी:

select * from (select foo from bar order by foo) where ROWNUM = x

1
where ROWNUM = xओरेकल डीबी में केवल x = 1 के लिए काम करेंगे। यानी where ROWNUM = 2किसी भी पंक्तियों को वापस नहीं करेंगे।
एएफएफ

5

Oracle 12c में, आप OFFSET..FETCH..ROWS विकल्प का उपयोग कर सकते हैंORDER BY

उदाहरण के लिए, शीर्ष से तीसरा रिकॉर्ड प्राप्त करने के लिए:

SELECT * 
FROM   sometable
ORDER BY column_name
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY;

4

यहां आपके भ्रम का एक तेज़ समाधान है।

SELECT * FROM table ORDER BY `id` DESC LIMIT N, 1

यहां आपको N = 0 भरने के द्वारा अंतिम पंक्ति मिल सकती है, N = 1 द्वारा दूसरा अंतिम, भरने वाले N = 3 द्वारा चौथा अंतिम और इसी तरह।

यह साक्षात्कार पर बहुत ही सामान्य प्रश्न है और यह बहुत ही सरल है।

इसके अलावा, यदि आप चाहते हैं तो राशि, आईडी या यू से कुछ न्यूमेरिक सॉर्टिंग ऑर्डर MySQL में CAST फ़ंक्शन के लिए जा सकते हैं।

SELECT DISTINCT (`amount`) FROM cart ORDER BY CAST( `amount` AS SIGNED ) DESC LIMIT 4 , 1

यहां N = 4 भरने से आप कार्ट तालिका से सबसे अधिक राशि का पांचवां अंतिम रिकॉर्ड प्राप्त कर पाएंगे। आप अपने क्षेत्र और तालिका का नाम फिट कर सकते हैं और समाधान के साथ आ सकते हैं।



3

उदाहरण के लिए, यदि आप MSSQL में प्रत्येक 10 वीं पंक्ति का चयन करना चाहते हैं, तो आप उपयोग कर सकते हैं;

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY ColumnName1 ASC) AS rownumber, ColumnName1, ColumnName2
  FROM TableName
) AS foo
WHERE rownumber % 10 = 0

बस एमओडी ले लो और नंबर 10 को यहां बदलो जिस भी नंबर को आप चाहते हैं।


3

SQL सर्वर के लिए, पंक्ति संख्या द्वारा जाने का एक सामान्य तरीका इस प्रकार है:

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 वीं पंक्ति की जानकारी लौटाएगा। बाद में rowcount 0 में रखना सुनिश्चित करें।


2

LIMIT n, 1 MS SQL सर्वर में काम नहीं करता है। मुझे लगता है कि यह केवल एकमात्र प्रमुख डेटाबेस के बारे में है जो उस वाक्य रचना का समर्थन नहीं करता है। निष्पक्ष होने के लिए, यह SQL मानक का हिस्सा नहीं है, हालांकि यह इतना व्यापक रूप से समर्थित है कि यह होना चाहिए। SQL सर्वर को छोड़कर सब कुछ में LIMIT महान काम करता है। SQL सर्वर के लिए, मैं एक सुंदर समाधान खोजने में सक्षम नहीं है।


1
ओरेकल, डीबी 2 को छोड़कर, पूरी दुनिया में हर उद्यम स्तर डेटाबेस के बारे में अच्छी तरह से। PostgreSQL एकमात्र एंटरप्राइज़ सक्षम डेटाबेस के बारे में है, जो लिमिट कीवर्ड का समर्थन करता है, और ऐसा इसलिए है क्योंकि ओपन सोर्स होने के कारण इसे ACID अज्ञानतावश MySQL भीड़ द्वारा स्वीकार्य होने की आवश्यकता होती है।
डेविड

3
@AlexD इस "उत्तर" को टिप्पणियों को लागू करने से पहले स्टैकओवरफ़्लो के पुराने दिनों में वापस पोस्ट किया गया था। मैंने इसे एक अन्य उत्तर के लिए एक टिप्पणी के रूप में पोस्ट किया होगा, लेकिन समय पर, टिप्पणियां मौजूद नहीं थीं।
किबी

2

यहाँ पर मैंने हाल ही में ओरेकल के लिए लिखा है कि गतिशील पेजिंग / छँटाई - 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);

2

लेकिन वास्तव में, यह सब वास्तव में सिर्फ पहली जगह में अच्छे डेटाबेस डिजाइन के लिए पार्लर ट्रिक्स नहीं है? कुछ समय के लिए मुझे इस तरह की कार्यक्षमता की आवश्यकता थी यह एक त्वरित रिपोर्ट बनाने के लिए एक सरल क्वेरी के लिए था। किसी भी वास्तविक काम के लिए, इस तरह की चाल का उपयोग करना मुसीबत को आमंत्रित कर रहा है। यदि किसी विशेष पंक्ति का चयन करना आवश्यक है, तो बस एक अनुक्रमिक मान वाला एक कॉलम होना चाहिए और उसके साथ किया जाना चाहिए।


2

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;

1

Sybase SQL में कहीं भी:

SELECT TOP 1 START AT n * from table ORDER BY whatever

ORDER BY को न भूलें या यह अर्थहीन है।


1

T-SQL - एक तालिका से N'th 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


1
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

मैंने यह पंक्ति Nth पंक्ति खोजने के लिए लिखी है। इस प्रश्न के साथ उदाहरण होगा

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

0

अविश्वसनीय है कि आप इस एक को क्रियान्वित करने के लिए एक 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

0

कुछ भी नहीं फैंसी, कोई विशेष कार्य नहीं है, जैसे कि आप कैच का उपयोग करते हैं जैसे मैं करता हूं ...

SELECT TOP 1 * FROM (
  SELECT TOP n * FROM <table>
  ORDER BY ID Desc
)
ORDER BY ID ASC

यह देखते हुए कि आपके पास एक आईडी कॉलम या डेटास्टैम्प कॉलम है जिस पर आप भरोसा कर सकते हैं।


0

यह है कि मैं इसे DB2 SQL के भीतर कैसे करूँगा, मेरा मानना ​​है कि RRN (सापेक्ष रिकॉर्ड संख्या) को O / S द्वारा तालिका के भीतर संग्रहीत किया जाता है;

SELECT * FROM (                        
   SELECT RRN(FOO) AS RRN, FOO.*
   FROM FOO                         
   ORDER BY RRN(FOO)) BAR             
 WHERE BAR.RRN = recordnumber

0
select * from 
(select * from ordered order by order_id limit 100) x order by 
x.order_id desc limit 1;

पहले आरोही क्रम में शीर्ष 100 पंक्तियों का चयन करें और फिर अवरोही क्रम में अंतिम पंक्ति का चयन करें और 1. तक सीमित करें। हालाँकि यह एक बहुत ही महंगा कथन है क्योंकि यह डेटा को दो बार एक्सेस करता है।


0

यह मुझे लगता है कि, कुशल होने के लिए, आपको 1) 0 के बीच एक यादृच्छिक संख्या उत्पन्न करने और डेटाबेस रिकॉर्ड की संख्या से कम करने की आवश्यकता है, और 2) उस स्थिति में पंक्ति का चयन करने में सक्षम हो। दुर्भाग्य से, विभिन्न डेटाबेस में अलग-अलग यादृच्छिक संख्या जनरेटर होते हैं और परिणाम सेट में किसी स्थान पर एक पंक्ति का चयन करने के लिए अलग-अलग तरीके होते हैं - आमतौर पर आप निर्दिष्ट करते हैं कि कितनी पंक्तियों को छोड़ना है और आप कितनी पंक्तियाँ चाहते हैं, लेकिन यह अलग-अलग डेटाबेस के लिए अलग-अलग किया गया है। यहाँ कुछ है जो SQLite में मेरे लिए काम करता है:

select * 
from Table 
limit abs(random()) % (select count(*) from Words), 1;

यह सीमा खंड में एक उपश्रेणी का उपयोग करने में सक्षम होने पर निर्भर करता है (जो कि SQLite में है LITIT <स्किप करने के लिए>, <recs to ले>) तालिका में रिकॉर्ड की संख्या का चयन करना विशेष रूप से कुशल होना चाहिए, डेटाबेस का हिस्सा होना मेटा डेटा, लेकिन यह डेटाबेस के कार्यान्वयन पर निर्भर करता है। इसके अलावा, मुझे नहीं पता कि क्वेरी वास्तव में Nth रिकॉर्ड प्राप्त करने से पहले सेट किए गए परिणाम का निर्माण करेगी, लेकिन मुझे आशा है कि इसकी आवश्यकता नहीं है। ध्यान दें कि मैं "खंड" आदेश को निर्दिष्ट नहीं कर रहा हूँ। प्राथमिक कुंजी की तरह कुछ को "ऑर्डर" करना बेहतर हो सकता है, जिसमें एक इंडेक्स होगा - एक इंडेक्स से एनटीटी रिकॉर्ड प्राप्त करना तेज हो सकता है यदि डेटाबेस डेटाबेस से एनटीटी रिकॉर्ड प्राप्त नहीं कर सकता है बिना परिणाम सेट किए बिना। ।


0

सबसे उपयुक्त उत्तर मैंने sql सर्वर के लिए इस लेख पर देखा है

WITH myTableWithRows AS (
    SELECT (ROW_NUMBER() OVER (ORDER BY myTable.SomeField)) as row,*
    FROM myTable)
SELECT * FROM myTableWithRows WHERE row = 3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.