سؤال

لدي هذا الاستعلام مع 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 للبند LIMIT إجرامي، IMO. يجب أن لا يكون للقيام بهذا النوع من الحل kludgy.

وبدءا من SQL SERVER 2012، يمكنك استخدام إزاحة إحضار جملة:

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/ مكتبة / ms188385 (ت = sql.110) .aspx اتصال

وهذا قد لا تعمل بشكل صحيح عندما يكون النظام التي ليست فريدة من نوعها.

إذا تم تعديل الاستعلام إلى ترتيب حسب تاريخ الطلب، مجموعة النتائج التي تم إرجاعها لا كما هو متوقع.

وهذا هو تقريبا نسخة طبق الأصل من السؤال الذي سألته في أكتوبر: محاكاة الشرط LIMIT الخلية في Microsoft SQL Server 2000

إذا كنت تستخدم 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 في الجواب .

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

وهذه هي الطريقة التي تحد من النتائج في MS 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 هو رقم السجل / الصف الذي تريد بدء سحب من في الجدول، أي بمعنى: إذا كان هناك 40 سجلات في الجدول 1، ورمز أعلاه تبدأ سحب من الصف 10

.

ووyy هو عدد السجلات / الصفوف التي تريد سحب من الجدول.

لنبني على سبيل المثال السابق: إذا الجدول 1 ديه 40 سجلات وكنت بدأت سحب من الصف 10 والاستيلاء على المجموعة التالية من 10 (yy). وهذا يعني، رمز أعلاه ستسحب السجلات من الجدول 1 ابتداء من الصف 10 وتنتهي في 20. وهكذا سحب الصفوف 10 - 20

وتحقق من الوصلة للمزيد من المعلومات عن إزاحة

ونحوي الخلية الاستعلام LIMIT شيء من هذا القبيل:

SELECT * FROM table LIMIT OFFSET, ROW_COUNT

ويمكن أن يترجم هذا إلى Microsoft SQL خادم مثل

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 

هذا هو أحد الأسباب التي تجعلني أحاول تجنب استخدام MS Server ...لكن على اي حال.في بعض الأحيان ليس لديك خيار (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

WHERE يقتصر على تلك البيانات الموجودة في الصفوف بين 10 و 20 (بدلاً من البحث في مجموعة البيانات بأكملها والحد من الإخراج).

وهذا هو نهج الخطوة متعددة من شأنها أن تعمل في 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
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;

في SQL هناك لا توجد الكلمة LIMIT. إذا كنت بحاجة فقط لعدد محدود من صفوف يجب عليك استخدام الكلمة TOP الذي يشبه إلى LIMIT.

ويجب أن نحاول. في الاستعلام أدناه، يمكنك ان ترى مجموعة من، تأمر، تخطي الصفوف، والصفوف الحد.

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

وإذا كان هو غير مصنفة فريد نوع معرف أو قيمة id الخاص بك في الجدول ID الخاص بك يجب أن تفعل مثل هذا أدناه.

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

و

ستكون الشفرة

select * from limit 2,5

إذا كنت أتذكر بشكل صحيح (انها كانت فترة من الوقت منذ أن كنت مست مع SQL Server) التي قد تكون قادرة على استخدام شيء من هذا القبيل: (2005 و متابعة)

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

وهو نفسه ك

SELECT * FROM table LIMIT 0,10;

هنا مقال عن تنفيذ الحد في MSSQL لها قراءة لطيفة، وخاصة التعليقات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top