SQLクエリを使用して上位N行を選択できます。ターゲットデータベースは、OracleまたはMySQLです。これにはエレガントなアプローチがありますか? (言うまでもなく、ここでソートされたデータを扱っています。)上位N行をフェッチするデータベースに依存しないSQLクエリがありますか?
答えて
をこのスニペットをチェックアウト:
CREATE TABLE people
(id int,
name string,
score int)
は、このSQLを試してみてください。
SELECT id,
name,
score
FROM people p
WHERE (SELECT COUNT(*)
FROM people p2
WHERE p2.score > p.score
) <=4
私は、これは動作するはずと信じてほとんどの場所で。
いいえ構文が異なります。
ただし、ビューを作成することがあります。
/* Oracle */
CREATE VIEW v_table
AS
SELECT *
FROM (
SELECT *
FROM table
ORDER BY
column
)
WHERE rownum <= n
/* MySQL */
CREATE VIEW v_table
AS
SELECT *
FROM table
ORDER BY
column
LIMIT n
私はMySQLとMSSQLの間だけでも、可能性はないと思います。私はそのような動作をシミュレートするためのオプションをとっています:
- 自動インクリメントint列を持つビューを作成します。言うような「PagingHelperID」
- 書き込みクエリ:これは難しい注文になります
SELECT columns FROM viewname WHERE PagingHelperID BETWEEN startindex AND stopindex
は、あなたがデータを盗んする予定ですべての注文に異なるビューが必要になります。
また、データベースに応じてクエリを実行し、独自のリライタのメソッドを定義するときに、SQLを「書き直す」こともできますが、これを行う「良い」方法はないと思います。
私はどのような種類のデータベース検出も避けたい。 – pugmarx
テーブル上の一意のキーがある場合ははい...
Select * From Table O
Where (Select Count(*) From Table I
Where [UniqueKeyValue] < O.UniqueKeyValue) < N
あなたは「トップ」の定義は、いくつかの他のロジックに基づいてしたい場合は、一意のキーに比べて、独自の基準を置き換えることができます...
EDIT: "Top"の意味を定義する "sort"が一意ではない列または列の集合に基づいている場合でも、これを使用することはできますが、正確にN個のレコードを得ることができるでしょう...
Select * From Table O
Where (Select Count(*) From Table I
Where nonUniqueCol < O.nonUniqueCol) < 10
[nonUniqueCol]にレコード8,9,10,11,12の値がすべて同じ場合、クエリでは7つのレコード( '<')...または12 「< =」)
注:これは、相関サブクエリを伴うため、パフォーマンスは非常に大きなテーブルのために問題になることができます...
ユニークキーがGUIDまたはその他の非シーケンシャルデータの場合はどうなりますか? –
ユニークキーでは、レコードを識別することができます。「トップ」の意味を定義する「ソート」が他のロジックに基づいている場合、そのサブクエリはそのレコードに基づいてレコードを「カウント」するように書き込まれますロジック...もし唯一の問題は、N個の値が複数のインスタンスが存在する特定の値に発生する場合です。(レコード8,9,10,11がすべて同じ値を持つ場合は、トップ10) –
私は、すべての製品は、これを達成するために異なる構文を次のだと思います。以下の同様の質問を見つけてください。 Is there an ANSI SQL alternative to the MYSQL LIMIT keyword?
大きな問題は、これを調べた後、MySQLがISO SQL:2003に準拠していないことです。それがあった場合は、これらの便利なウィンドウ機能を持っていると思います:
SELECT * from
( SELECT
RANK() OVER (ORDER BY <blah>) AS ranking,
<rest of columns here>,
FROM <table>
)
WHERE ranking <= <N>
ああ、MySQLの(それは行動だ模倣するなど、例えばSQLiteの)、それゆえ全体が制限していない問題を。
この表からトップ5得点を取得するにはウィキペディアから(http://en.wikipedia.org/wiki/Window_function_(SQL)#Limiting_result_rows)
- 1. パンダ:上位N行、グループあたり上位N行、ROW_NUMBER以上(パーティションBY ... ORDER BY ...)
- 2. informix SQLクエリでn番目の行をフェッチする
- 3. Linq to SQL - 上位n行を返します
- 4. ハイブに一日あたりの上位N行を取得します - ランク()
- 5. SQLの上位Nの値
- 6. JavaScriptに依存しているWebページがありますか?
- 7. グループあたりの平均上位n個のSQL Server
- 8. SQLクエリに依存する列
- 9. nokogiriに依存しないSOAP gemはありますか?
- 10. エンジンに依存しないReflect.parseはありますか?
- 11. SQLクエリにエラーがありますか?
- 12. DISTINCTが見つからないSQL依存関係がありません
- 13. paramsが存在するかどうかに依存するRailsのSQLクエリ
- 14. クエリがありません行をフェッチできません
- 15. 列に基づいて行をフェッチするSQLクエリ
- 16. SQLクエリがすべてをフェッチしない
- 17. 他の行に依存するSQLクエリを実行するにはどうすればよいですか?
- 18. jQuery.eachがArray.forEachに依存しない理由はありますか?
- 19. パッケージに依存関係がない場合、npm installを実行するのは意味がありますか?
- 20. あいまいな依存関係が存在する場合のSession.run()でのフェッチの順序
- 21. テーブルAからテーブルB行にSQL挿入上位n名は、行
- 22. ファイルシステムで動作するプラットフォームに依存しないライブラリファイルはありますか?
- 23. AutoItでSQLクエリを実行する必要があります
- 24. サーブレットコンテキストよりも上位に何かがありますか
- 25. DRY、より良いgradle依存宣言がありますか?
- 26. 位置に依存しない実行ファイルとptrace
- 27. Javaの極端にデータベースに依存しないクエリ...または一般的に
- 28. 行内のフィールドに依存するSQLクエリはどうですか?
- 29. 依存するDLLはいつ存在する必要がありますか?
- 30. (n + 1)型の型は、(n)型に依存します)
(少なくともTOP n句を使用している場合はSQLサーバー上で)表示を強制的に制限するという制限があります。 – Tomalak
そして、他のDBMSもこの概念をサポートしていますが、他の表記を使用しています。 –
また、一部のDBMSでは、ビュー内のORDER BY句を使用できません。 –