2009-05-05 7 views

答えて

2

をこのスニペットをチェックアウト:

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 

私は、これは動作するはずと信じてほとんどの場所で。

2

いいえ構文が異なります。

ただし、ビューを作成することがあります。

/* 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 
+1

(少なくともTOP n句を使用している場合はSQLサーバー上で)表示を強制的に制限するという制限があります。 – Tomalak

+1

そして、他のDBMSもこの概念をサポートしていますが、他の表記を使用しています。 –

+0

また、一部のDBMSでは、ビュー内のORDER BY句を使用できません。 –

1

私はMySQLとMSSQLの間だけでも、可能性はないと思います。私はそのような動作をシミュレートするためのオプションをとっています:

  1. 自動インクリメントint列を持つビューを作成します。言うような「PagingHelperID」
  2. 書き込みクエリ:これは難しい注文になりますSELECT columns FROM viewname WHERE PagingHelperID BETWEEN startindex AND stopindex

は、あなたがデータを盗んする予定ですべての注文に異なるビューが必要になります。

また、データベースに応じてクエリを実行し、独自のリライタのメソッドを定義するときに、SQLを「書き直す」こともできますが、これを行う「良い」方法はないと思います。

+0

私はどのような種類のデータベース検出も避けたい。 – pugmarx

1

テーブル上の一意のキーがある場合ははい...

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 「< =」)

注:これは、相関サブクエリを伴うため、パフォーマンスは非常に大きなテーブルのために問題になることができます...

+0

ユニークキーがGUIDまたはその他の非シーケンシャルデータの場合はどうなりますか? –

+0

ユニークキーでは、レコードを識別することができます。「トップ」の意味を定義する「ソート」が他のロジックに基づいている場合、そのサブクエリはそのレコードに基づいてレコードを「カウント」するように書き込まれますロジック...もし唯一の問題は、N個の値が複数のインスタンスが存在する特定の値に発生する場合です。(レコード8,9,10,11がすべて同じ値を持つ場合は、トップ10) –

0

大きな問題は、これを調べた後、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

関連する問題