web-dev-qa-db-ja.com

サブクエリでのORDER BYのデータベース実装

SQLステートメントをラップするアプリケーション(MapServer- http://mapserver.org/ )を使用しているため、ORDER BYステートメントは内部クエリ内にあります。例えば。

SELECT * FROM (
        SELECT ID, GEOM, Name
        FROM t
        ORDER BY Name
        ) as tbl

アプリケーションには、さまざまなデータベースドライバーがあります。主にMS SQL ServerドライバーとSQL Server 2008を使用しています。サブクエリでORDER BYが見つかった場合、エラーがスローされます。

MS Docsから(これはSQL Server 2000の場合ですが、まだ適用されているようです):

ビュー、インライン関数、派生テーブル、またはサブクエリでORDER BY句を使用する場合、順序付けされた出力は保証されません。代わりに、ORDER BY句は、Top演算子によって生成された結果セットに一貫した構成があることを保証するためにのみ使用されます。 ORDER BY句は、最も外側のSELECTステートメントで指定されている場合にのみ、順序付けされた結果セットを保証します。

ただし、Postgres(9)およびOracleで実行した場合、同じタイプのクエリが結果を返します-サブクエリで定義された順序で。 Postgresでは、クエリプランは結果がソートされていることを示し、Postgresのリリースノートには、サブクエリの順序が使用されることを意味する項目が含まれています。

サブクエリORDER BYが上位クエリに一致する場合はソートを回避

http://en.wikipedia.org/wiki/Order_by の状態:

一部のデータベースシステムでは、副選択またはビュー定義でORDER BY句を指定できますが、そこに存在しても効果はありません。

ただし、クエリプランの私自身のチェックから:

  • SQL Server 2008はサブクエリでのORDER BYをサポートしていません
  • Postgres 9はサブクエリでのORDER BYをサポートしています
  • Oracle 10gはサブクエリでのORDER BYをサポートします

だから私の質問は、PostgresとOracleがサブクエリでの並べ替えを許可しないことを公式に確認または否定できるリンクはありますか?

10
geographika

アプリケーションを作成する必要がありますnotORDER BYをサブクエリ内に配置します(多分、不要なものを使用しないオプションがあるかもしれません)そもそもサブクエリ)。既に発見したように、この構文はTOPがないSQL Serverではサポートされていません。また、TOPを使用すると、一部の行を省略したくない場合を除いて、TOP 100 PERCENTを使用するとORDER BYが最適化されてレンダリングされます。

また、OracleとPostGresでは、構文がsupportedであっても、それに従うことを意味するものではありません。また、一部のシナリオで従うものとして観察したからといって、新しいバージョンが出たり、データ、統計、クエリ自体、または環境に微妙な変更が加えられたりしても従うことを意味するわけではありません。

間違いなく、ご注文について保証が必要な場合は、ORDER BYは、最も外側のクエリです。これはdoctrineである必要があります。使用しているプラ​​ットフォームに関係なく、近くに保持します。

あなたは何かがサポートされていないことを公式に述べているリンクを求めています。これは、あなたの車が飛べないという公式声明を車のオーナーズマニュアルで見るようなものです。

14
Aaron Bertrand