問題:
結果テーブルの各行に個別の番号を付けたいと思います。
例:
私たちのデータベースには、furniture
次の列にデータがあります:code
(主キー)とname
。
code | 名前 |
---|---|
101 | ベッド |
202 | ソファ |
333 | 椅子 |
123 | 本棚 |
235 | テーブル |
766 | デスク |
furniture
テーブルには、番号を付けたい家具の名前が格納されています。
解決策:
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
クエリは、各家具の行番号とその名前およびコードを返します。
num_row | 名前 | コード |
---|---|---|
1 | ベッド | 101 |
2 | ソファ | 202 |
3 | 椅子 | 333 |
4 | 本棚 | 123 |
5 | テーブル | 235 |
6 | デスク | 766 |
家具の名前は並べ替えられていないことに注意してください。
ディスカッション:
結果セットの各行に番号を付ける場合、SQLはROW_NUMBER()
を提供します 働き。この関数はSELECT
で使用されます 他の列を持つ句。 ROW_NUMBER()
の後 句、OVER()
を呼び出します 働き。 OVER
に引数を渡した場合 、行の番号付けはどの列に従ってもソートされません。したがって、表示される行の順序は非決定的です。ほとんどの場合、これはレコードがテーブルに挿入された順序です。行の番号付けは1から始まります。この例では、各レコードの番号は1から6です。
列を使用して行番号を割り当てることもできます。以下の例では、名前でソートされたレコードに番号を付けています。これを行うには、その引数をOVER
に渡します。 ORDER BY
と一緒に (名前の列に従ってレコードを並べ替えます):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
結果セットを見ると、並べ替えられた行とその番号が表示されます。
row | 名前 | コード |
---|---|---|
1 | ベッド | 101 |
2 | 本棚 | 123 |
3 | 椅子 | 333 |
4 | デスク | 766 |
5 | ソファ | 202 |
6 | テーブル | 235 |
ROW_NUMBER()
によって提供される番号付け 結果テーブルの行の順序とは無関係です。以下の例では、並べ替えられた列名(OVER(ORDER BY name)
)、ただし、別の列(この例では、ORDER BY code
。
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
クエリは各行の番号を返しましたが、レコードは列コードに従って並べ替えられているため、これらの番号は昇順ではありません。
row | 名前 | コード |
---|---|---|
1 | ベッド | 101 |
2 | 本棚 | 123 |
5 | ソファ | 202 |
6 | テーブル | 235 |
3 | 椅子 | 333 |
4 | デスク | 766 |
ソートされた行のデフォルトの順序は昇順ですが、DESC
を使用して降順でソートすることもできます。 並べ替える列の名前の後のキーワード:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
上記のクエリは結果セットを返しました:
row | 名前 | コード |
---|---|---|
4 | デスク | 766 |
3 | 椅子 | 333 |
6 | テーブル | 235 |
5 | ソファ | 202 |
2 | 本棚 | 123 |
1 | ベッド | 101 |