Probleem:
U wilt elke rij in de resultatentabel een apart nummer geven.
Voorbeeld:
Onze database heeft een tabel met de naam furniture
met gegevens in de volgende kolommen:code
(primaire sleutel) en name
.
code | naam |
---|---|
101 | bed |
202 | bank |
333 | stoel |
123 | boekenkast |
235 | tabel |
766 | bureau |
De furniture
table slaat de naam op van meubelstukken die we willen nummeren.
Oplossing:
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
De zoekopdracht retourneert het rijnummer van elk meubelstuk samen met de naam en code:
num_row | naam | code |
---|---|---|
1 | bed | 101 |
2 | bank | 202 |
3 | stoel | 333 |
4 | boekenkast | 123 |
5 | tabel | 235 |
6 | bureau | 766 |
Merk op dat de namen van de meubelstukken niet gesorteerd zijn.
Discussie:
Als u elke rij in een resultatenset wilt nummeren, biedt SQL de ROW_NUMBER()
functie. Deze functie wordt gebruikt in een SELECT
clausule met andere kolommen. Na de ROW_NUMBER()
clausule noemen we de OVER()
functie. Als u argumenten doorgeeft aan OVER
, wordt de nummering van rijen niet gesorteerd op een kolom. De volgorde van de weergegeven rijen is dus niet-deterministisch; in de meeste gevallen is dit de volgorde waarin de records in de tabel zijn ingevoegd. De nummering van rijen begint bij 1. In ons voorbeeld heeft elk record een nummer van 1 tot 6.
We kunnen ook rijnummers toewijzen met behulp van een kolom. In het onderstaande voorbeeld nummeren we records gesorteerd op naam. We doen dit door dat argument door te geven aan OVER
samen met ORDER BY
(het sorteert records volgens de naamkolom):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
Als je naar de resultatenset kijkt, zie je de gesorteerde rijen met hun nummers:
rij | naam | code |
---|---|---|
1 | bed | 101 |
2 | boekenkast | 123 |
3 | stoel | 333 |
4 | bureau | 766 |
5 | bank | 202 |
6 | tabel | 235 |
De nummering geleverd door ROW_NUMBER()
is onafhankelijk van de volgorde van rijen in de resultatentabel. In het onderstaande voorbeeld nummeren we records met de gesorteerde kolomnaam (OVER(ORDER BY name)
), maar we geven records in de resultaatset weer volgens een andere kolom (in ons voorbeeld ORDER BY code
).
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
De query retourneerde het nummer elke rij, maar deze nummers zijn niet in oplopende volgorde, omdat records worden gesorteerd op basis van kolomcode:
rij | naam | code |
---|---|---|
1 | bed | 101 |
2 | boekenkast | 123 |
5 | bank | 202 |
6 | tabel | 235 |
3 | stoel | 333 |
4 | bureau | 766 |
De standaardvolgorde van de gesorteerde rijen is oplopend, maar u kunt ook in aflopende volgorde sorteren met de DESC
trefwoord achter de naam van de kolom waarop u wilt sorteren:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
De bovenstaande zoekopdracht leverde de resultatenset op:
rij | naam | code |
---|---|---|
4 | bureau | 766 |
3 | stoel | 333 |
6 | tabel | 235 |
5 | bank | 202 |
2 | boekenkast | 123 |
1 | bed | 101 |