古い SQL Server バージョンでの MySQL の LIMIT のレプリケーション
問題: SQL Server 2000 には、MySQL、PostgreSQL、SQLite などのデータベースにある、特定の行範囲を取得するための直接の LIMIT
句がありません。 この記事では、カーソル、T-SQL、ストアド プロシージャを使用しない回避策について説明します。
ソリューション (制限あり):
LIMIT
の直接エミュレーションは、追加の構成要素がなければ SQL Server 2000 では不可能です。 ただし、これらのメソッドは特定の状況下で機能します:
方法 1: 一意のキーを利用する
このアプローチは、結果セットに一意の列 (主キーなど) が含まれている場合にのみ機能します。
<code class="language-sql">SELECT TOP n * FROM tablename WHERE key NOT IN ( SELECT TOP x key FROM tablename ORDER BY key );</code>
ここで、x
はオフセットを表し、n
は取得する行数を表します。 内側のクエリは最初の x
行を除外し、外側のクエリは後続の n
行を選択します。
方法 2: シミュレートされた行番号付け
行番号を生成できる場合 (ただし、これには多少の操作が必要です)、サブクエリと BETWEEN
:
<code class="language-sql">SELECT z2.* FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) as rn, * FROM mytable ) z2 WHERE z2.rn BETWEEN x + 1 AND x + n;</code>
(注: ROW_NUMBER()
は SQL Server 2000 では使用できません。この例はその概念を示しています。SQL Server 2000 では適切な行番号付けの代替手段を実装する必要があります。) x
はオフセットであり、n
行数。
方法 3 (SQL Server 2005 以降 – 比較用):
新しい SQL Server バージョン (2005 以降) の場合、EXCEPT
ステートメントはよりクリーンなソリューションを提供します。
<code class="language-sql">SELECT * FROM (SELECT TOP 75 COL1, COL2 FROM MYTABLE ORDER BY COL3) AS foo EXCEPT SELECT * FROM (SELECT TOP 50 COL1, COL2 FROM MYTABLE ORDER BY COL3) AS bar;</code>
これにより、行 51 ~ 75 が取得されます。 この方法は SQL Server 2000 には適用できません。
結論:
SQL Server 2000 で MySQL の LIMIT
の正確な機能を実現することは困難です。 提供されているソリューションは回避策を提供しますが、特定のテーブル構造に依存するか、行番号付けの回避策が必要です。 最適なパフォーマンスと機能を実現するには、新しい SQL Server バージョンにアップグレードすることを強くお勧めします。
以上がカーソル、T-SQL、またはストアド プロシージャを使用せずに SQL Server 2000 で MySQL の LIMIT 句をエミュレートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。