sql >> データベース >  >> RDS >> Sqlserver

TOP句を使用して、SQLServerクエリで返される行を制限する

    SQL Serverでは、TOPを使用できます クエリ結果セットから返される行を制限する句。この句は、LIMITと同様の機能を提供します MySQLの場合、およびROWNUM Oracleでは、これらのそれぞれの動作方法に違いがあります。

    以下は、TOPの使用例です。 SQLServerの結果セットを制限する句。

    例1-基本的な使用法

    TOPの基本的な例を次に示します。 作品:

    SELECT TOP(3) * 
    FROM Albums;
    

    結果:

    +-----------+-----------------------+---------------+------------+-----------+
    | AlbumId   | AlbumName             | ReleaseDate   | ArtistId   | GenreId   |
    |-----------+-----------------------+---------------+------------+-----------|
    | 1         | Powerslave            | 1984-09-03    | 1          | 1         |
    | 2         | Powerage              | 1978-05-05    | 2          | 1         |
    | 3         | Singing Down the Lane | 1956-01-01    | 6          | 3         |
    +-----------+-----------------------+---------------+------------+-----------+
    

    この場合、結果を3行に制限しました。

    もう一度クエリを実行しましょう。ただし、今回はTOPを使用しません。 条項:

    SELECT * 
    FROM Albums;
    

    結果:

    +-----------+--------------------------+---------------+------------+-----------+
    | AlbumId   | AlbumName                | ReleaseDate   | ArtistId   | GenreId   |
    |-----------+--------------------------+---------------+------------+-----------|
    | 1         | Powerslave               | 1984-09-03    | 1          | 1         |
    | 2         | Powerage                 | 1978-05-05    | 2          | 1         |
    | 3         | Singing Down the Lane    | 1956-01-01    | 6          | 3         |
    | 4         | Ziltoid the Omniscient   | 2007-05-21    | 5          | 1         |
    | 5         | Casualties of Cool       | 2014-05-14    | 5          | 1         |
    | 6         | Epicloud                 | 2012-09-18    | 5          | 1         |
    | 7         | Somewhere in Time        | 1986-09-29    | 1          | 1         |
    | 8         | Piece of Mind            | 1983-05-16    | 1          | 1         |
    | 9         | Killers                  | 1981-02-02    | 1          | 1         |
    | 10        | No Prayer for the Dying  | 1990-10-01    | 1          | 1         |
    | 11        | No Sound Without Silence | 2014-09-12    | 9          | 4         |
    | 12        | Big Swing Face           | 1967-06-01    | 4          | 2         |
    | 13        | Blue Night               | 2000-11-01    | 12         | 4         |
    | 14        | Eternity                 | 2008-10-27    | 12         | 4         |
    | 15        | Scandinavia              | 2012-06-11    | 12         | 4         |
    | 16        | Long Lost Suitcase       | 2015-10-09    | 7          | 4         |
    | 17        | Praise and Blame         | 2010-06-26    | 7          | 4         |
    | 18        | Along Came Jones         | 1965-05-21    | 7          | 4         |
    | 19        | All Night Wrong          | 2002-05-05    | 3          | 2         |
    | 20        | The Sixteen Men of Tain  | 2000-03-20    | 3          | 2         |
    | 21        | Yo Wassup                | 2019-03-12    | 9          | 3         |
    | 22        | Busted                   | 1901-05-11    | 9          | 3         |
    +-----------+--------------------------+---------------+------------+-----------+
    

    したがって、最初のクエリがより大きなセットから最初の3つだけを返したことがわかります。

    例2–ORDERBY句の使用

    Microsoftは、常にORDER BYを使用することがベストプラクティスであると述べています TOPを使用する場合 句。これは、TOPの影響を受ける行を予測可能に示す唯一の方法だからです。 。

    したがって、最初の例を次のように書き直すことができます。

    SELECT TOP(3) * 
    FROM Albums
    ORDER BY AlbumId;
    

    結果:

    +-----------+-----------------------+---------------+------------+-----------+
    | AlbumId   | AlbumName             | ReleaseDate   | ArtistId   | GenreId   |
    |-----------+-----------------------+---------------+------------+-----------|
    | 1         | Powerslave            | 1984-09-03    | 1          | 1         |
    | 2         | Powerage              | 1978-05-05    | 2          | 1         |
    | 3         | Singing Down the Lane | 1956-01-01    | 6          | 3         |
    +-----------+-----------------------+---------------+------------+-----------+
    

    順序が結果にどのように影響するかを理解することが重要です。そうしないと、予期しない結果になる可能性があります。

    同じクエリをもう一度使用して、別の列で並べ替えるとどうなりますか。

    SELECT TOP(3) * 
    FROM Albums
    ORDER BY ArtistId;
    

    結果:

    +-----------+-------------------+---------------+------------+-----------+
    | AlbumId   | AlbumName         | ReleaseDate   | ArtistId   | GenreId   |
    |-----------+-------------------+---------------+------------+-----------|
    | 1         | Powerslave        | 1984-09-03    | 1          | 1         |
    | 7         | Somewhere in Time | 1986-09-29    | 1          | 1         |
    | 8         | Piece of Mind     | 1983-05-16    | 1          | 1         |
    +-----------+-------------------+---------------+------------+-----------+
    

    順番に挿入、削除、更新

    ただし、TOPを使用することもできます。 INSERTの句 、UPDATEMERGE 、およびDELETE ステートメントでは、ORDER BYを直接指定することはできません これらのステートメントの句。ただし、sub-selectステートメントを使用して、意味のある時系列で行を挿入、削除、または変更できます。

    例3–WITHTIES引数の使用

    オプションのWITH TIESを使用できます 制限された結果セットの最後の場所に関連するすべての行を返す引数。これは、ORDER BYを使用する場合にのみ適用されます(使用のみ可能です)。 条項。

    ORDER BYの場合 句を使用すると、WITH TIESを使用して、2つ以上の行が最後の場所に結合されます。 、それらすべてが返されます。これにより、実際に指定したよりも多くの行が返される可能性があります。

    これは例で簡単に説明できます。

    SELECT TOP(3) WITH TIES *
    FROM Albums
    ORDER BY ArtistId;
    

    結果:

    +-----------+-------------------------+---------------+------------+-----------+
    | AlbumId   | AlbumName               | ReleaseDate   | ArtistId   | GenreId   |
    |-----------+-------------------------+---------------+------------+-----------|
    | 1         | Powerslave              | 1984-09-03    | 1          | 1         |
    | 7         | Somewhere in Time       | 1986-09-29    | 1          | 1         |
    | 8         | Piece of Mind           | 1983-05-16    | 1          | 1         |
    | 9         | Killers                 | 1981-02-02    | 1          | 1         |
    | 10        | No Prayer for the Dying | 1990-10-01    | 1          | 1         |
    +-----------+-------------------------+---------------+------------+-----------+
    

    ここでは、上位3行のみを返すように指定していますが、実際には5行が返されます。これは、同じArtistIdを使用する行が5つあるため、行3〜5がすべて最後の場所に関連付けられているためです。この場合、私はWITH TIESを使用します それらすべてを返すために。

    WITH TIESを削除した場合 、3行のみが返されます:

    SELECT TOP(3) * 
    FROM Albums
    ORDER BY ArtistId;
    

    結果:

    +-----------+-------------------+---------------+------------+-----------+
    | AlbumId   | AlbumName         | ReleaseDate   | ArtistId   | GenreId   |
    |-----------+-------------------+---------------+------------+-----------|
    | 1         | Powerslave        | 1984-09-03    | 1          | 1         |
    | 7         | Somewhere in Time | 1986-09-29    | 1          | 1         |
    | 8         | Piece of Mind     | 1983-05-16    | 1          | 1         |
    +-----------+-------------------+---------------+------------+-----------+
    

    WITH TIESに注意してください 引数はSELECTでのみ指定できます ステートメント、およびORDER BYを使用する場合のみ 句。また、レコードを結ぶために返される順序は任意です。

    例4–パーセンテージの使用

    設定された行数の代わりにパーセンテージ値を指定するオプションもあります。これを行うには、PERCENTを使用します 引数。

    例:

    SELECT TOP(10) PERCENT * 
    FROM Albums
    ORDER BY AlbumId;
    

    結果:

    +-----------+-----------------------+---------------+------------+-----------+
    | AlbumId   | AlbumName             | ReleaseDate   | ArtistId   | GenreId   |
    |-----------+-----------------------+---------------+------------+-----------|
    | 1         | Powerslave            | 1984-09-03    | 1          | 1         |
    | 2         | Powerage              | 1978-05-05    | 2          | 1         |
    | 3         | Singing Down the Lane | 1956-01-01    | 6          | 3         |
    +-----------+-----------------------+---------------+------------+-----------+
    

    小数値は次の整数値に切り上げられることに注意してください。この場合、22行の10パーセントは2.2ですが、切り上げられたため、3行になります。

    したがって、パーセンテージを2倍にしても、必ずしも行数が2倍になるとは限りません。

    SELECT TOP(20) PERCENT * 
    FROM Albums
    ORDER BY AlbumId;
    

    結果:

    +-----------+------------------------+---------------+------------+-----------+
    | AlbumId   | AlbumName              | ReleaseDate   | ArtistId   | GenreId   |
    |-----------+------------------------+---------------+------------+-----------|
    | 1         | Powerslave             | 1984-09-03    | 1          | 1         |
    | 2         | Powerage               | 1978-05-05    | 2          | 1         |
    | 3         | Singing Down the Lane  | 1956-01-01    | 6          | 3         |
    | 4         | Ziltoid the Omniscient | 2007-05-21    | 5          | 1         |
    | 5         | Casualties of Cool     | 2014-05-14    | 5          | 1         |
    +-----------+------------------------+---------------+------------+-----------+
    

    この場合、22の20パーセントは4.4です。繰り返しになりますが、切り上げられ、5行になります。

    例5–括弧の削除

    TOPを使用する場合、括弧を削除することができます ただし、この条項はお勧めしません。

    いずれにせよ、前の例から括弧を削除する例を次に示します。

    SELECT TOP 20 PERCENT * 
    FROM Albums
    ORDER BY AlbumId;
    

    結果:

    +-----------+------------------------+---------------+------------+-----------+
    | AlbumId   | AlbumName              | ReleaseDate   | ArtistId   | GenreId   |
    |-----------+------------------------+---------------+------------+-----------|
    | 1         | Powerslave             | 1984-09-03    | 1          | 1         |
    | 2         | Powerage               | 1978-05-05    | 2          | 1         |
    | 3         | Singing Down the Lane  | 1956-01-01    | 6          | 3         |
    | 4         | Ziltoid the Omniscient | 2007-05-21    | 5          | 1         |
    | 5         | Casualties of Cool     | 2014-05-14    | 5          | 1         |
    +-----------+------------------------+---------------+------------+-----------+
    

    INSERTで必要な使用法との一貫性を提供するため、常に括弧を使用することをお勧めします。 、UPDATEMERGE 、およびDELETE ステートメント。

    下位互換性の理由から、括弧はオプションです。


    1. Visual C#2008でのtnsnames.oraの解析

    2. 1ではなく2で始まるOracleシーケンス

    3. 2014年10月CPUがArcGISDesktopをクラッシュ

    4. PostgreSQLのpggemをUbuntuにインストールするにはどうすればよいですか?