MySQLでこのクエリを使用します。
select * from table1 LIMIT 10,20
SQL Serverでこれを行うにはどうすればよいですか?
MySQLでこのクエリを使用します。
select * from table1 LIMIT 10,20
SQL Serverでこれを行うにはどうすればよいですか?
回答:
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。この種の無骨な回避策を実行する必要はありません。
SQL SERVER 2012以降、OFFSET FETCH句を使用できます。
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に変更された場合、返される結果セットは期待どおりではありません。
これは、10月に尋ねた質問とほぼ同じ です。MicrosoftSQL Server 2000でのMySQL LIMIT句のエミュレート
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;
これは、MS SQL Server 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
)を取得したとします。つまり、上記のコードは、行1から20で終わるテーブル1からレコードをプルします。したがって、行10から20をプルします。
オフセットの詳細については、リンクを確認してください
SELECT *
FROM (
SELECT TOP 20
t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
FROM table1 t
ORDER BY
field1
) t
WHERE rn > 10
構文的には、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
これが、MSサーバーの使用を避けようとする理由の1つですが、とにかく。時々、あなたにはオプションがないだけです(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までの行にあるデータに制限されます。
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 TOP 10 * FROM table;
と同じです
SELECT * FROM table LIMIT 0,10;
ここでMsSQLがで制限を実装についての記事です。その素敵な読み取り、特別にコメントが。
SQLでは、LIMITキーワードは存在しません。限られた数の行だけが必要な場合は、LIMITと同様のTOPキーワードを使用する必要があります。
IDが一意の識別子タイプであるか、テーブル内のIDがソートされていない場合は、以下のようにする必要があります。
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;
-列[カウント]を指定し、何かを注文せずにすべての行に一意のカウントを割り当てて、制限を提供できる場所で再度選択します。
以下のように結果を得る可能な方法の1つは、これが役立つことを願っています。
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
私が正しく覚えている場合は(SQL Serverを使用してからしばらく経っています)、次のようなものを使用できる場合があります(2005以降)。
SELECT
*
,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum]
FROM SomeTable
WHERE RowNum BETWEEN 10 AND 20
WHERE
同じレベルSELECT
句で定義されたエイリアスで参照することはできません。