কীভাবে এসকিউএল সার্ভারের সাথে সীমাবদ্ধতা প্রয়োগ করবেন?


130

আমার এই প্রশ্নটি মাইএসকিউএল সহ রয়েছে:

select * from table1 LIMIT 10,20

আমি কীভাবে এসকিউএল সার্ভার দিয়ে এটি করতে পারি?



13
যেহেতু এই প্রশ্নটি আগে জিজ্ঞাসা করা হয়েছিল, অন্য প্রশ্নটি নকল হবে না?
ট্যাব আললেমান

উত্তর:


127

এসকিউএল সার্ভার 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 টি সারি থাকে তবে 2 য় ক্যোয়ারী ব্যর্থ হয়। এটি আপনাকে 5 থেকে 14 পর্যন্ত সারি দেয়, তবে আপনি 11 থেকে 14 পর্যন্ত সারিগুলি চান general
বিল কারভিন

147
এমএস দ্বারা এ জাতীয় একটি সহজ জিনিস আবার করা দরকার!
মার্টিন

এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও 2017 এ আমার জন্য যা কাজ করেছে তা এখানে রয়েছে: নির্বাচন করুন * থেকে [ডিবিও] নির্বাচন করুন <<টেবিলের নামটি এখানে >োকান করুন << নীচে নীচে নীচে <সন্ধান করুন <কমপক্ষে এখানে সন্নিবেশ করুন>
এরিটোরিয়াস 2718

জাস্ট ফ্যান্টাস্টিক, এটি এমএস এসকিউএল সার্ভারে কবিতার মতো কাজ করছে 2017 নির্বাচনী বিবৃতি নির্বাচন করুন
প্যাটসনলাইনার

58

আড়ষ্ট, তবে কাজ করবে।

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

এমএমএসকিউএল-র একটি সীমাবদ্ধ ধারা বাদ দেওয়া আইএমও অপরাধী। আপনার এই ধরণের ক্লডজি ওয়ার্কআরাউন্ড করা উচিত নয়।


এটিকে বাইপাস করার জন্য আপনার কাছে অন্য কোনও পরামর্শ আছে?
বিগবলস

শেষবারের মতো এমএসএসকিউএল মোকাবেলা করার জন্য আমি প্রচুর গুগলিং করেছি এবং এটিই আমার সেরা সমাধান। আনন্দদায়ক নয়, তবে এটি কাজ করে।
সিজেজোজ

এই সমাধানটি কেবল তখনই কাজ করে যদি ফলাফল সেটটিতে একটি কলাম থাকে যা অনন্য that এটি কোনও প্রশ্নের জন্য লিমিটেডের নকল করার সাধারণ সমাধান নয়।
বিল কারভিন

1
আমি এই মুহূর্তে একই ধরণের ঝগড়াটে আছি ... তবে, আমার ক্ষেত্রে আমি আটকানো হয়েছি ... তথাকথিত বিশেষজ্ঞ 'ডিবিএ'র সিদ্ধান্ত নেওয়ার পরে সিদ্ধান্ত হয় যে কোনও টেবিলে অপ্রয়োজনীয় একটি অনন্য কী ... কোনও টেবিলে ... এমনকি বিদেশী কী এবং সীমাবদ্ধতার বিষয়ও সামনে আনবেন না!
অ্যান্ড্রু রোলিংস

এটির সাথে সমস্যাটি হ'ল, এটি যেখানে ক্লউজগুলি খুব ভালভাবে পরিচালনা করে না ... আমি টেম্প টেবিলগুলি চেষ্টা করব, কারণ এটি আমার পক্ষে কাজ করে না।
দুষ্টু পেস্টি

37

এসকিউএল সার্ভার ২০১২ দিয়ে শুরু করে আপনি অফসটি ফেচ ক্লজটি ব্যবহার করতে পারেন:

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

অর্ডারটি অনন্য না হলে এটি সঠিকভাবে কাজ করতে পারে না।

যদি ক্যোয়ারী অর্ডার তারিখে অর্ডারতে পরিবর্তন করা হয়, প্রত্যাশিত ফলাফল সেট প্রত্যাশিত হয় না।


'উইথ' ব্যবহারের জন্য অনুসন্ধান শেষ করতে অর্ধেক সময় প্রয়োজন - @ লিওন টায়সনের উত্তর দেখুন। এটি ধীর করতে মাইক্রোসফ্ট কী করেছে তা আমার কোনও ধারণা নেই have
isHuman

1
কেন এটি গৃহীত উত্তর নয়? আমরা উচ্চস্বরে কান্নার জন্য 2018 এ আছি !
অধিনায়ক 14

1
@ স্কিপার ডান। গৃহীত এখনও কাজ করে। আসুন আপডেটটি প্রতিফলিত করার জন্য এইটিকে আপভোট করুন।
ক্রোনন

18

এটি আমি অক্টোবরে জিজ্ঞাসা করা একটি প্রশ্নের প্রায় সদৃশ: মাইক্রোসফ্ট এসকিউএল সার্ভার 2000 এ মাইএসকিউএল লিমিটেড অনুচ্ছেদটি অনুকরণ করুন

আপনি যদি মাইক্রোসফ্ট এসকিউএল সার্ভার 2000 ব্যবহার করেন তবে এর থেকে ভাল কোনও সমাধান নেই। বেশিরভাগ লোককে IDENTITYপ্রাথমিক কী সহ অস্থায়ী টেবিলে ক্যোয়ারির ফলাফল ক্যাপচার করতে হবে । তারপরে একটি BETWEENশর্ত ব্যবহার করে প্রাথমিক কী কলামের বিরুদ্ধে জিজ্ঞাসা করুন ।

আপনি যদি মাইক্রোসফ্ট এসকিউএল সার্ভার 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;

@ লিওন টায়সনের উত্তরে দেখানো হিসাবে আপনি এটি সাধারণ টেবিল এক্সপ্রেশন হিসাবেও লিখতে পারেন ।


ROW_NUMBER () ওভার (অর্ডার বাই) এএনএসআই এসকিউএল: 2003 এ বৈধ হওয়ার জন্য পয়েন্ট পেয়েছে, যদিও এসকিউএল সার্ভার ব্যতীত অন্য ডিবিএমএসে সমর্থনটি খুব স্পটযুক্ত। এবং এটি অবশ্যই বেশ
জঘন্য

@ ববিন্স: এটি ওরাকল, মাইক্রোসফ্ট এসকিউএল সার্ভার 2005, আইবিএম ডিবি 2, এবং পোস্টগ্রিসকিউএল 8.4 সমস্ত সমর্থন উইন্ডো ফাংশন সক্রিয় করে। এটি এসকিউএল বাজারের একটি বিশাল সংখ্যাগরিষ্ঠ। সমর্থনটি কেবলমাত্র স্পষ্টতাই যদি আপনি মাইএসকিউএল, এসকিউএলাইট বা ডিবি'র উপরের কোনও পুরানো সংস্করণ ব্যবহার করেন।
বিল কারভিন

16

এমএস এসকিউএল সার্ভার ২০১২-এ আমি এইভাবে ফলাফলগুলি সীমাবদ্ধ করলাম:

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 ) । এর অর্থ হ'ল, উপরের কোডটি সারণি 1 থেকে 10 সারি থেকে শুরু করে 20 এ শেষ হবে। রেকর্ডগুলি টানবে Thus এভাবে সারিগুলি 10 - 20 এ টানতে হবে।

অফসেটে আরও তথ্যের জন্য লিঙ্কটি দেখুন


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

ঠিক আছে, আমি কেবল যাচাই করেছি, এসকিউএল সার্ভারটি ROW_NUMBER () শর্তগুলিতে থামিয়ে দিতে যথেষ্ট স্মার্ট হয়ে উঠেছে, যদি সেখানে অর্ডারের বিধি অনুসারে কোনও সূচকযুক্ত কলাম থাকে।
কাসনসুই

9

সিনট্যাক্টিক্যালি মাইএসকিউএল লিমিটেড কোয়েরিটি হ'ল এইরকম:

SELECT * FROM table LIMIT OFFSET, ROW_COUNT

এটি মাইক্রোসফ্ট এসকিউএল সার্ভারে অনুবাদ করা যেতে পারে

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

এমএস সার্ভার ব্যবহার করা এড়ানোর চেষ্টা করার একটি কারণ এটি ... তবে যাইহোক। কখনও কখনও আপনার কাছে কেবল বিকল্প নেই (ইয়ে! এবং আমাকে একটি পুরানো সংস্করণ ব্যবহার করতে হবে !!)।

আমার পরামর্শটি ভার্চুয়াল টেবিল তৈরি করা:

থেকে:

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

ক্ষেত্রগুলি যুক্ত করা বা অপসারণ করা হলে, "সারি" স্বয়ংক্রিয়ভাবে আপডেট হয়।

এই বিকল্পটির সাথে প্রধান সমস্যাটি হল অর্ডার বাই স্থির। সুতরাং আপনি যদি অন্য কোনও আদেশ চান তবে আপনাকে অন্য একটি ভিউ তৈরি করতে হবে।

হালনাগাদ

এই পদ্ধতির সাথে অন্য একটি সমস্যা রয়েছে: আপনি যদি আপনার ডেটা ফিল্টার করার চেষ্টা করেন তবে এটি প্রত্যাশার মতো কাজ করবে না। উদাহরণস্বরূপ, যদি আপনি এটি করেন:

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

10 থেকে 20 এর মধ্যে সারিগুলিতে থাকা সমস্ত ডেটা যেখানে সীমাবদ্ধ হয়ে যায় (পুরো ডেটাসেটটি সন্ধান করার পরিবর্তে এবং আউটপুট সীমিত করার পরিবর্তে)।


1

এটি একটি মাল্টি স্টেপ অ্যাপ্রোচ যা এসকিউএল 2000 এ কাজ করবে।

-- 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;

আমার জন্য দুর্দান্ত সমাধান ছিল।
টাইড

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;

এমএসএসকিউএলে সীমাবদ্ধতা বাস্তবায়ন সম্পর্কে এখানে একটি নিবন্ধ এখানে একটি দুর্দান্ত পড়া, বিশেষত মন্তব্যসমূহ।


1
ধন্যবাদ, তবে আমি 10 এবং 20 এর মধ্যে রেকর্ড চাই, এটি করার একটি উপায় আছে?
বিগবলস

5
এই উত্তরটি মূল প্রশ্নের জবাব দেয় না, তবে আমার মতো যদি কারও প্রথম এন ফলাফল কীভাবে পাওয়া যায় এবং গুগল ইত্যাদির মাধ্যমে এখানে পাওয়া যায় তবে তা কার্যকর হবে ...
brianlmerritt

0

এসকিউএলে কোনও সীমাবদ্ধ কীওয়ার্ড নেই। আপনার যদি কেবল সীমিত সংখ্যক সারি প্রয়োজন হয় আপনার একটি শীর্ষ কীওয়ার্ড ব্যবহার করা উচিত যা একটি 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

এমএসএসকিউএলএক্সপ্রেস 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'

এমএস স্কুয়েল:

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

অর্ডার বাই বাধ্যতামূলক


-2

যদি আমি সঠিকভাবে মনে রাখি (এসকিউএল সার্ভারের সাথে ডাব করার পরে কিছুক্ষণ হয়ে গেছে) আপনি এরকম কিছু ব্যবহার করতে সক্ষম হতে পারেন: (২০০৫ এবং পরবর্তী)

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

এসকিউএল সার্ভার 2012: এমএসজি 207, স্তর 16, রাজ্য 1, লাইন 5 অবৈধ কলামের নাম 'রোউনম'।
ই তথ্য 128

আপনার বিবৃতিতে কোথাও টাইপ রয়েছে বলে মনে হচ্ছে। রোউনাম হ'ল নামটি যা আমরা প্রকাশের জন্য নির্ধারণ করি। উত্সটির সাথে আপনার সমস্যা পোস্ট করুন এবং সম্প্রদায় আপনাকে সহায়তা করবে
ক্রিস

এটি বৈধ সিনট্যাক্স নয়। আপনি WHEREএকই স্তরের ধারাটিতে সংজ্ঞায়িত কোনও উপনামে রেফারেন্স করতে পারবেন না SELECT
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.