मेरे पास MySQL के साथ यह प्रश्न है:
select * from table1 LIMIT 10,20
मैं SQL सर्वर के साथ ऐसा कैसे कर सकता हूं?
मेरे पास MySQL के साथ यह प्रश्न है:
select * from table1 LIMIT 10,20
मैं SQL सर्वर के साथ ऐसा कैसे कर सकता हूं?
जवाबों:
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
क्लंकी, लेकिन यह काम करेगा।
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 है। आपको इस तरह के कुडल वर्कअराउंड नहीं करना चाहिए।
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 में संशोधित किया गया है, तो लौटाया गया परिणाम अपेक्षित नहीं है।
यह अक्टूबर में पूछे गए एक प्रश्न का लगभग एक डुप्लिकेट है: 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 के उत्तर में दिखाया गया है ।
इस तरह से मैं एमएस 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 के बारे में अधिक जानकारी के लिए लिंक देखें
SELECT *
FROM (
SELECT TOP 20
t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
FROM table1 t
ORDER BY
field1
) t
WHERE rn > 10
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
यह एक कारण है कि मैं एमएस सर्वर का उपयोग करने से बचने की कोशिश करता हूं ... लेकिन फिर भी। कभी-कभी आपके पास बस एक विकल्प नहीं होता है (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 के बीच की पंक्तियों में होते हैं (पूरे डेटासेट को खोजने और आउटपुट को सीमित करने के बजाय)।
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;
कोशिश करनी चाहिए। नीचे दिए गए क्वेरी में, आप समूह के अनुसार, क्रम से, पंक्तियों को छोड़ सकते हैं और पंक्तियों को सीमित कर सकते हैं।
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
SELECT TOP 10 * FROM table;
के समान है
SELECT * FROM table LIMIT 0,10;
यहाँ MsSQL में लिमिट को लागू करने के बारे में एक लेख दिया गया है।
SQL में कोई भी LIMIT कीवर्ड मौजूद नहीं है। यदि आपको केवल सीमित संख्या में पंक्तियों की आवश्यकता है तो आपको एक TOP कीवर्ड का उपयोग करना चाहिए जो कि एक LIMIT के समान है।
यदि आपकी आईडी अद्वितीय पहचानकर्ता प्रकार है या आपकी आईडी तालिका में नहीं है, तो आपको नीचे ऐसा करना चाहिए।
select * from
(select ROW_NUMBER() OVER (ORDER BY (select 0)) AS RowNumber,* from table1) a
where a.RowNumber between 2 and 5
कोड होगा
2,5 की सीमा से * का चयन करें
MSSQLExpress 2017 में इसका बेहतर उपयोग करें।
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) as [Count], * FROM table1
) as a
WHERE [Count] BETWEEN 10 and 20;
- एक कॉलम [काउंट] देना और हर पंक्ति को बिना किसी आदेश के एक अद्वितीय गिनती देना और फिर से फिर से चयन करें जहां आप अपनी सीमा प्रदान कर सकते हैं .. :)
नीचे दिए गए परिणाम प्राप्त करने के संभावित तरीकों में से एक, उम्मीद है कि यह मदद करेगा।
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
अगर मुझे सही ढंग से याद है (एसक्यूएल सर्वर के साथ डब किए हुए कुछ समय हो गया है) तो आप इस तरह से कुछ का उपयोग करने में सक्षम हो सकते हैं: (2005 और)
SELECT
*
,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum]
FROM SomeTable
WHERE RowNum BETWEEN 10 AND 20
WHERE
समान स्तर SELECT
खंड में परिभाषित उपनाम में संदर्भित नहीं कर सकते ।