174

私は次のようなことをしようとしています:

SELECT * FROM table LIMIT 10,20

また

SELECT * FROM table LIMIT 10 OFFSET 10

ただし、SQL Server を使用する

私が見つけた唯一の解決策は、やり過ぎのように見えます:

SELECT * FROM ( 
  SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases 
 ) a WHERE row > 5 and row <= 10

私も見つけました

SELECT TOP 10 * FROM stuff; 

...しかし、開始制限を指定できないため、やりたいことではありません。

私がそれを行う別の方法はありますか?

また、ちょっと興味がありますが、SQL Server が関数などをサポートしていない理由はありますLIMITか? 意地悪をしたくはありませんが、これは DBMS に必要なもののように思えます... もしそうなら、無知で申し訳ありません! 過去 5 年間、MySQL と SQL+ を使用してきたので...

4

15 に答える 15

140

SQL Server 2012 +の場合、を使用できます

SELECT  *
FROM     sys.databases
ORDER BY name 
OFFSET  5 ROWS 
FETCH NEXT 5 ROWS ONLY 
于 2012-02-11T16:46:58.667 に答える
113

このLIMIT句は、標準 SQL の一部ではありません。MySQL、PostgreSQL、および SQLite による SQL のベンダー拡張機能としてサポートされています。

他のブランドのデータベースにも同様の機能がある場合がありますが ( TOPMicrosoft SQL Server など)、常に同じように機能するとは限りません。

TOPを模倣するために Microsoft SQL Server で使用するのは困難です。LIMITうまくいかないケースもあります。

あなたが示したソリューションはROW_NUMBER()、Microsoft SQL Server 2005 以降で使用できます。これは、クエリの一部としてのみ機能する (現時点では) 最適なソリューションです。

もう 1 つの解決策は、最初のカウント+オフセットTOP行をフェッチしてから、API を使用して最初のオフセット行をシークすることです。

以下も参照してください。

于 2009-06-09T19:34:04.557 に答える
36

お気づきのとおり、これは推奨されるSQLServerの方法です。

SELECT * FROM ( 
  SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases 
 ) a WHERE a.row > 5 and a.row <= 10
于 2009-06-09T19:19:55.070 に答える
10

SQL Server 2012+ を使用している場合は、Martin Smith の回答OFFSETに投票し、およびFETCH NEXT拡張機能を使用してORDER BY

不幸にも以前のバージョンで立ち往生している場合は、次のようなことができます。

WITH Rows AS
(
    SELECT
              ROW_NUMBER() OVER (ORDER BY [dbo].[SomeColumn]) [Row]
            , *
        FROM
              [dbo].[SomeTable]
)
SELECT TOP 10
          *
     FROM
         Rows
    WHERE Row > 10

私は機能的に同等であると信じています

SELECT * FROM SomeTable LIMIT 10 OFFSET 10 ORDER BY SomeColumn

MS SQL 2012の前に、TSQLでそれを行うことについて私が知っている最高のパフォーマンスの方法。


行数が非常に多い場合は、CTE の代わりに一時テーブルを使用すると、パフォーマンスが向上する可能性があります。

于 2012-07-04T15:27:35.623 に答える
9

これはどう?

SET ROWCOUNT 10 

SELECT TOP 20 *
FROM sys.databases
ORDER BY database_id DESC

最初の 20 行のうち最後の 10 行が表示されます。1 つの欠点は順序が逆であることですが、少なくとも覚えやすいです。

于 2009-06-09T19:33:40.580 に答える
7

残念ながら、これROW_NUMBER()が最善の方法です。limitortop句の結果は、特定の順序に関係なく実際には意味がないため、実際にはより正確です。しかし、それでもやるのは苦痛です。

更新: SQL Server 2012は、OFFSETおよびFETCHキーワードlimitを介して同様の機能を追加します。これは、非標準のMySql拡張機能である、とは対照的に、ANSI標準のアプローチです。LIMIT

于 2009-06-09T19:19:18.080 に答える
3
SELECT TOP 10 *
FROM TABLE
WHERE IDCOLUMN NOT IN (SELECT TOP 10 IDCOLUMN FROM TABLE)

レコード 11 ~ 20 を指定する必要があります。さらにページを取得するためにインクリメントする場合、おそらくあまり効率的ではなく、順序によってどのように影響を受けるかはわかりません。両方の WHERE ステートメントでこれを指定する必要がある場合があります。

于 2011-01-10T15:46:46.990 に答える
0

MS SQL Server のオンライン ドキュメント ( http://technet.microsoft.com/en-us/library/ms186734.aspx ) から、特定の行セットを取得するためにテストして動作する例を次に示します。ROW_NUMBER には OVER が必要ですが、好きな順序で並べることができます。

WITH OrderedOrders AS
(
  SELECT SalesOrderID, OrderDate,
  ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber
  FROM Sales.SalesOrderHeader 
) 
SELECT SalesOrderID, OrderDate, RowNumber  
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60;
于 2013-10-08T20:15:00.280 に答える
0
select * from (select id,name,ROW_NUMBER() OVER (ORDER BY id  asc) as row
from tableName1) tbl1
where tbl1.row>=10 and tbl1.row<=15

10 から 15 までの行を出力します。

于 2013-01-22T07:20:44.410 に答える
0

これまでのところ、この形式は私にとってうまくいっています(ただし、最高のパフォーマンスではありません):

SELECT TOP {desired amount of rows} * 
FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY {order columns} asc)__row__ FROM {table})tmp
WHERE __row__ > {offset row count}

補足として、動的データのページネーションは、奇妙な/予期しない結果につながる可能性があります。

于 2013-08-09T05:08:48.483 に答える