SQL सर्वर के साथ LIMIT कैसे लागू करें?


130

मेरे पास MySQL के साथ यह प्रश्न है:

select * from table1 LIMIT 10,20

मैं SQL सर्वर के साथ ऐसा कैसे कर सकता हूं?



13
चूँकि यह प्रश्न पहले पूछा गया था, क्या दूसरा प्रश्न डुप्लिकेट नहीं होगा?
ताब अललेमन

जवाबों:


127

SQL SERVER 2005 शुरू, आप यह कर सकते हैं ...

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 10 AND 20;

या 2000 और नीचे के संस्करणों के लिए ऐसा कुछ ...

SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC

6
यदि आपके पास तालिका में 14 पंक्तियाँ हैं, तो दूसरी क्वेरी विफल हो जाती है। यह आपको 14 के माध्यम से 5 पंक्तियाँ देता है, लेकिन आप 14. के माध्यम से पंक्तियों को 11 चाहते हैं। सामान्य तौर पर, यह किसी परिणाम के अंतिम "पेज" के लिए विफल रहता है, जब तक कि कुल पंक्तियाँ उस "पृष्ठ" आकार के कई नहीं होती हैं।
बिल कार्विन

147
इस तरह की एक साधारण बात को एमएस द्वारा फिर से इतनी मुश्किल बनाने की जरूरत है!
मार्टिन

यहाँ SQL Server Management Studio 2017 में मेरे लिए क्या काम किया गया है: * FROM [[dbo] सेलेक्ट करें। <डालें यहां टेबलनेम>> जहाँ @ ROWCOUNT BETWEEN <डालें min डालें> और <अधिकतम यहाँ डालें>
Artorias2718

बस शानदार, यह एमएस SQL ​​सर्वर 2017 के चयन में आकर्षण की तरह काम करता है
PatsonLeaner

58

क्लंकी, लेकिन यह काम करेगा।

SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 10 id FROM table ORDER BY id) FROM table ORDER BY id

एक सीमा खंड के MSSQL की चूक आपराधिक, IMO है। आपको इस तरह के कुडल वर्कअराउंड नहीं करना चाहिए।


क्या आपके पास इसे बाईपास करने का एक और सुझाव है?
बिगबॉल

मैंने पिछली बार MSSQL से निपटने के लिए बहुत से Googling किया था और यह सबसे अच्छा समाधान था जो मुझे मिला। सुखद नहीं है, लेकिन यह काम करता है।
सिजयोज़ 20

यह समाधान केवल तभी काम करता है जब परिणाम सेट में एक स्तंभ शामिल होता है जो अद्वितीय होता है। यह किसी भी प्रश्न के लिए LIMIT की नकल करने का सामान्य समाधान नहीं है।
बिल कार्विन

1
मैं अभी इसी तरह के सवालों के घेरे में हूँ ... हालाँकि, मेरे मामले में मैं hosed हूँ ... यह तब और भी अधिक आपराधिक है जब तथाकथित 'विशेषज्ञ' dba का निर्णय लेते हैं कि एक तालिका में अनावश्यक रूप से एक अद्वितीय कुंजी ... कोई भी तालिका ... विदेशी कुंजी और बाधाओं के विषय को भी मत लाओ!
एंड्रयू रोलिंग

यह एक समस्या है, यह बहुत अच्छी तरह से संभाल नहीं करता है ... मैं अस्थायी तालिकाओं की कोशिश करने जा रहा हूं, क्योंकि यह मेरे लिए काम नहीं कर रहा है।
बुरा पास्ट नोवी

37

SQL SERVER 2012 से शुरू होकर, आप OFFSET FETCH Clause का उपयोग कर सकते हैं:

USE AdventureWorks;
GO
SELECT SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader 
ORDER BY SalesOrderID
    OFFSET 10 ROWS
    FETCH NEXT 10 ROWS ONLY;
GO

http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx

जब आदेश अद्वितीय नहीं है तो यह सही ढंग से काम नहीं कर सकता है।

यदि क्वेरी को ORDER BY OrderDate में संशोधित किया गया है, तो लौटाया गया परिणाम अपेक्षित नहीं है।


'के साथ' का उपयोग केवल क्वेरी को समाप्त करने के लिए आधे समय की आवश्यकता है - @Leon Tayson का उत्तर देखें। मुझे नहीं पता कि Microsoft ने इसे धीमा करने के लिए क्या किया।
हनुमान

1
यह स्वीकृत उत्तर क्यों नहीं है? हम 2018 में ज़ोर से रोने के लिए हैं!
स्किपर

1
@ स्किपर सही। स्वीकार किए जाते हैं एक अभी भी काम करता है। चलो अद्यतन को प्रतिबिंबित करने के लिए इसे एक अपवोट करें।
क्रोन

18

यह अक्टूबर में पूछे गए एक प्रश्न का लगभग एक डुप्लिकेट है: Microsoft SQL Server 2000 में MySQL सीमा का अनुकरण करें

यदि आप Microsoft SQL Server 2000 का उपयोग कर रहे हैं, तो कोई अच्छा उपाय नहीं है। अधिकांश लोगों को IDENTITYप्राथमिक कुंजी के साथ अस्थायी तालिका में क्वेरी के परिणाम को कैप्चर करने के लिए सहारा लेना पड़ता है । फिर एक BETWEENशर्त का उपयोग करके प्राथमिक कुंजी कॉलम के खिलाफ क्वेरी करें ।

यदि आप Microsoft SQL Server 2005 या उसके बाद का उपयोग कर रहे हैं, तो आपके पास एक ROW_NUMBER()फ़ंक्शन है, तो आप एक ही परिणाम प्राप्त कर सकते हैं लेकिन अस्थायी तालिका से बचें।

SELECT t1.*
FROM (
    SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.*
    FROM ( ...original SQL query... ) t1
) t2
WHERE t2.row BETWEEN @offset+1 AND @offset+@count;

आप इसे एक सामान्य तालिका अभिव्यक्ति के रूप में भी लिख सकते हैं जैसा कि @Leon Tayson के उत्तर में दिखाया गया है ।


ROW_NUMBER () OVER (ORDER BY) को ANSI SQL: 2003 में मान्य होने के लिए अंक मिलते हैं, हालाँकि SQL Server के अलावा DBMSs में समर्थन बहुत धब्बेदार है। और यह निश्चित रूप से बहुत अच्छा है ...
bobince

@bobince: यह Oracle, Microsoft SQL Server 2005, IBM DB2 और PostgreSQL 8.4 सभी विंडो कार्यों का समर्थन करता है। यह SQL बाजार का एक बड़ा हिस्सा शामिल है। यदि आप MySQL, SQLite या DB के ऊपर के पुराने संस्करण का उपयोग करते हैं तो समर्थन केवल धब्बेदार है।
बिल कार्विन

16

इस तरह से मैं एमएस SQL ​​सर्वर 2012 में परिणामों को सीमित करता हूं:

SELECT * 
FROM table1
ORDER BY columnName
  OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

नोट: OFFSETकेवल के साथ या के लिए इस्तेमाल किया जा सकता है ORDER BY

कोड लाइन समझाने के लिए OFFSET xx ROWS FETCH NEXT yy ROW ONLY

xxरिकॉर्ड / पंक्ति संख्या आप मेज, यानी में से खींच शुरू करना चाहते है: यदि तालिका 1 में 40 रिकॉर्ड कर रहे हैं, इसके बाद के संस्करण कोड पंक्ति 10 से खींच शुरू कर देंगे।

वह yyरिकॉर्ड / पंक्तियों की संख्या है जिसे आप तालिका से खींचना चाहते हैं।

पिछले उदाहरण पर निर्माण करने के लिए: यदि तालिका 1 में 40 रिकॉर्ड हैं और आपने पंक्ति 10 से खींचना शुरू किया और 10 ( yy) के NEXT सेट को पकड़ो । इसका मतलब यह होगा कि ऊपर दिया गया कोड तालिका 1 से रिकॉर्ड्स को 10 पंक्ति में शुरू करेगा और 20 पर समाप्त होगा। इस प्रकार पंक्तियों को 10 - 20 तक खींच देगा।

OFFSET के बारे में अधिक जानकारी के लिए लिंक देखें


12
SELECT  *
FROM    (
        SELECT  TOP 20
                t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
        FROM    table1 t
        ORDER BY
                field1
        ) t
WHERE   rn > 10

ठीक है, मैंने अभी-अभी जाँच की, SQL सर्वर ROW_NUMBER () स्थितियों को रोकने के लिए पर्याप्त स्मार्ट निकला, अगर ORDER BY खंड में एक अनुक्रमित स्तंभ है।
क्वासोनी

9

Syntactically MySQL LIMIT क्वेरी कुछ इस प्रकार है:

SELECT * FROM table LIMIT OFFSET, ROW_COUNT

इसे Microsoft SQL Server में अनुवादित किया जा सकता है

SELECT * FROM 
(
    SELECT TOP #{OFFSET+ROW_COUNT} *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum 
    FROM table
) a
WHERE rnum > OFFSET

अब आपकी क्वेरी select * from table1 LIMIT 10,20इस तरह होगी:

SELECT * FROM 
(
    SELECT TOP 30 *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum 
    FROM table1
) a
WHERE rnum > 10 

2

यह एक कारण है कि मैं एमएस सर्वर का उपयोग करने से बचने की कोशिश करता हूं ... लेकिन फिर भी। कभी-कभी आपके पास बस एक विकल्प नहीं होता है (yei! और मुझे एक पुराने संस्करण का उपयोग करना होगा !!)।

मेरा सुझाव एक आभासी तालिका बनाना है:

से:

SELECT * FROM table

सेवा:

CREATE VIEW v_table AS    
    SELECT ROW_NUMBER() OVER (ORDER BY table_key) AS row,* FROM table

फिर बस क्वेरी:

SELECT * FROM v_table WHERE row BETWEEN 10 AND 20

यदि फ़ील्ड जोड़े जाते हैं, या हटा दिए जाते हैं, तो "पंक्ति" स्वचालित रूप से अपडेट हो जाती है।

इस विकल्प के साथ मुख्य समस्या यह है कि ORDER BY तय है। इसलिए यदि आप एक अलग क्रम चाहते हैं, तो आपको एक और दृश्य बनाना होगा।

अपडेट करें

इस दृष्टिकोण के साथ एक और समस्या है: यदि आप अपने डेटा को फ़िल्टर करने का प्रयास करते हैं, तो यह अपेक्षित रूप से काम नहीं करेगा। उदाहरण के लिए, यदि आप करते हैं:

SELECT * FROM v_table WHERE field = 'test' AND row BETWEEN 10 AND 20

वहाँ उन डेटा तक सीमित हो जाता है जो 10 और 20 के बीच की पंक्तियों में होते हैं (पूरे डेटासेट को खोजने और आउटपुट को सीमित करने के बजाय)।


1

यह एक बहु कदम दृष्टिकोण है जो SQL2000 में काम करेगा।

-- Create a temp table to hold the data
CREATE TABLE #foo(rowID int identity(1, 1), myOtherColumns)

INSERT INTO #foo (myColumns) SELECT myData order By MyCriteria

Select * FROM #foo where rowID > 10

1
SELECT 
    * 
FROM 
    (
        SELECT 
            top 20              -- ($a) number of records to show
            * 
        FROM
            (
                SELECT 
                    top 29      -- ($b) last record position
                    * 
                FROM 
                    table       -- replace this for table name (i.e. "Customer")
                ORDER BY 
                    2 ASC
            ) AS tbl1 
        ORDER BY 
            2 DESC
    ) AS tbl2 
ORDER BY 
    2 ASC;

-- Examples:

-- Show 5 records from position 5:
-- $a = 5;
-- $b = (5 + 5) - 1
-- $b = 9;

-- Show 10 records from position 4:
-- $a = 10;
-- $b = (10 + 4) - 1
-- $b = 13;

-- To calculate $b:
-- $b = ($a + position) - 1

-- For the present exercise we need to:
-- Show 20 records from position 10:
-- $a = 20;
-- $b = (20 + 10) - 1
-- $b = 29;

मेरे लिए एक महान समाधान था।
Tyde

1

कोशिश करनी चाहिए। नीचे दिए गए क्वेरी में, आप समूह के अनुसार, क्रम से, पंक्तियों को छोड़ सकते हैं और पंक्तियों को सीमित कर सकते हैं।

select emp_no , sum(salary_amount) from emp_salary
Group by emp_no 
ORDER BY emp_no 
OFFSET 5 ROWS       -- Skip first 5 
FETCH NEXT 10 ROWS ONLY; -- limit to retrieve next 10 row after skiping rows

0
SELECT TOP 10 * FROM table;

के समान है

SELECT * FROM table LIMIT 0,10;

यहाँ MsSQL में लिमिट को लागू करने के बारे में एक लेख दिया गया है।


1
धन्यवाद, लेकिन मैं 10 और 20 के बीच का रिकॉर्ड चाहता हूं, ऐसा करने का एक तरीका है?
Bigballs

5
यह उत्तर मूल प्रश्न का उत्तर नहीं देता है, लेकिन यह उपयोगी है अगर मेरे जैसे किसी व्यक्ति को यह जानने की आवश्यकता है कि पहला एन परिणाम कैसे प्राप्त करें और Google आदि के माध्यम से यहां
आए

0

SQL में कोई भी LIMIT कीवर्ड मौजूद नहीं है। यदि आपको केवल सीमित संख्या में पंक्तियों की आवश्यकता है तो आपको एक TOP कीवर्ड का उपयोग करना चाहिए जो कि एक LIMIT के समान है।


0

यदि आपकी आईडी अद्वितीय पहचानकर्ता प्रकार है या आपकी आईडी तालिका में नहीं है, तो आपको नीचे ऐसा करना चाहिए।

select * from
(select ROW_NUMBER() OVER (ORDER BY (select 0)) AS RowNumber,* from table1) a
where a.RowNumber between 2 and 5



कोड होगा

2,5 की सीमा से * का चयन करें

0

MSSQLExpress 2017 में इसका बेहतर उपयोग करें।

SELECT * FROM
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) as [Count], * FROM table1
) as a
WHERE [Count] BETWEEN 10 and 20;

- एक कॉलम [काउंट] देना और हर पंक्ति को बिना किसी आदेश के एक अद्वितीय गिनती देना और फिर से फिर से चयन करें जहां आप अपनी सीमा प्रदान कर सकते हैं .. :)


0

नीचे दिए गए परिणाम प्राप्त करने के संभावित तरीकों में से एक, उम्मीद है कि यह मदद करेगा।

declare @start int
declare @end int
SET @start = '5000';  -- 0 , 5000 ,
SET @end = '10000'; -- 5001, 10001
SELECT * FROM ( 
  SELECT TABLE_NAME,TABLE_TYPE, ROW_NUMBER() OVER (ORDER BY TABLE_NAME) as row FROM information_schema.tables
 ) a WHERE a.row > @start and a.row <= @end

0

आसान तरीका

माई एसक्यूएल:

SELECT 'filds' FROM 'table' WHERE 'where' LIMIT 'offset','per_page'

MSSQL:

SELECT 'filds' FROM 'table' WHERE 'where' ORDER BY 'any' OFFSET 'offset' 
ROWS FETCH NEXT 'per_page' ROWS ONLY

आदेश द्वारा अनिवार्य है


-2

अगर मुझे सही ढंग से याद है (एसक्यूएल सर्वर के साथ डब किए हुए कुछ समय हो गया है) तो आप इस तरह से कुछ का उपयोग करने में सक्षम हो सकते हैं: (2005 और)

SELECT
    *
   ,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum]
FROM SomeTable
WHERE RowNum BETWEEN 10 AND 20

SQL सर्वर 2012: Msg 207, स्तर 16, राज्य 1, पंक्ति 5 अमान्य स्तंभ नाम 'RowNum'।
ई-इंफो128 १२

लगता है कि आप अपने बयान में कहीं एक टाइपो है। रोवनम वह नाम है जिसे हम एक्सप्रेशन पर असाइन करते हैं। स्रोत के साथ अपनी समस्या पोस्ट करें और समुदाय आपकी सहायता करेगा
क्रिश

यह मान्य सिंटैक्स नहीं है। आप WHEREसमान स्तर SELECTखंड में परिभाषित उपनाम में संदर्भित नहीं कर सकते ।
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.