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 |