Problem:
Du vil gerne give hver række i resultattabellen et separat nummer.
Eksempel:
Vores database har en tabel med navnet furniture
med data i følgende kolonner:code
(primær nøgle) og name
.
kode | navn |
---|---|
101 | seng |
202 | sofa |
333 | stol |
123 | reol |
235 | tabel |
766 | skrivebord |
furniture
tabel gemmer navnet på møbler, som vi ønsker at nummerere.
Løsning:
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
Forespørgslen returnerer rækkenummeret for hvert møbel sammen med dets navn og kode:
num_row | navn | kode |
---|---|---|
1 | seng | 101 |
2 | sofa | 202 |
3 | stol | 333 |
4 | reol | 123 |
5 | tabel | 235 |
6 | skrivebord | 766 |
Bemærk, at navnene på møblerne ikke er sorteret.
Diskussion:
Hvis du gerne vil nummerere hver række i et resultatsæt, giver SQL ROW_NUMBER()
fungere. Denne funktion bruges i en SELECT
klausul med andre kolonner. Efter ROW_NUMBER()
klausul kalder vi OVER()
fungere. Hvis du sender nogle argumenter til OVER
, vil nummereringen af rækker ikke blive sorteret efter nogen kolonne. Således vil rækkefølgen af de viste rækker være ikke-deterministisk; i de fleste tilfælde er det den rækkefølge, posterne blev indsat i tabellen. Nummereringen af rækker starter ved 1. I vores eksempel har hver post et tal fra 1 til 6.
Vi kan også tildele rækkenumre ved hjælp af en kolonne. I eksemplet nedenfor nummererer vi poster sorteret efter navn. Det gør vi ved at sende argumentet til OVER
sammen med ORDER BY
(det sorterer poster efter navnekolonnen):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
Når du ser på resultatsættet, ser du de sorterede rækker med deres numre:
række | navn | kode |
---|---|---|
1 | seng | 101 |
2 | reol | 123 |
3 | stol | 333 |
4 | skrivebord | 766 |
5 | sofa | 202 |
6 | tabel | 235 |
Nummereringen leveret af ROW_NUMBER()
er uafhængig af rækkefølgen af rækker i resultattabellen. I eksemplet nedenfor nummererer vi poster ved hjælp af det sorterede kolonnenavn (OVER(ORDER BY name)
), men vi viser poster i resultatsættet i henhold til en anden kolonne (i vores eksempel, ORDER BY code
).
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
Forespørgslen returnerede nummeret for hver række, men disse tal er ikke i stigende rækkefølge, fordi poster er sorteret efter kolonnekode:
række | navn | kode |
---|---|---|
1 | seng | 101 |
2 | reol | 123 |
5 | sofa | 202 |
6 | tabel | 235 |
3 | stol | 333 |
4 | skrivebord | 766 |
Standardrækkefølgen af de sorterede rækker er stigende, men du kan også sortere i faldende rækkefølge ved hjælp af DESC
søgeord efter navnet på den kolonne, som du vil sortere efter:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
Forespørgslen ovenfor returnerede resultatsættet:
række | navn | kode |
---|---|---|
4 | skrivebord | 766 |
3 | stol | 333 |
6 | tabel | 235 |
5 | sofa | 202 |
2 | reol | 123 |
1 | seng | 101 |