Jeżeli trzeba wyświetlić co drugi rekord to trzeba sobie odpowiedzieć na pytanie co to znaczy co drugi rekord! Załóżmy, że zamierzam wyświetlić co drugiego pracownika z tabeli Person.Person ze względu na numer pracownika (BusinessEntietyID).
Załóżmy więc, że układam wszystkich pracowników wg ich ID. Wybór co drugiego jest teraz już prosty z algorytmicznego punktu widzenia. Numerujemy sobie pracowników (np funkcją Row_Number, opisaną już na mobilo). Potem wybieramy parzystych lub nieparzystych wykorzystując funkcję modulo.
Chciałoby się więc napisać:
SELECT ROW_NUMBER() OVER (ORDER BY BusinessEntityID) AS x, Firstname, LastNameFROM Person.Person p
WHERE x % 2 = 0
niestety nie można, bo nie można się odwołać do aliasu x w klauzuli WHERE.
Więc może tak zadziała:
SELECT ROW_NUMBER() OVER (ORDER BY BusinessEntityID) AS x, Firstname, LastNameFROM Person.Person p
WHERE ROW_NUMBER() OVER (ORDER BY BusinessEntityID) %2 = 0
ale też nie można:
Msg 4108, Level 15, State 1, Line 1
Windowed functions can only appear in the SELECT or ORDER BY clauses.
Na szczęście mamy podzapytania Włożymy wyżej opisane zapytanie do podzapytania i wtedy klauzula WHERE się powiedzie:
SELECT * FROM(
SELECT ROW_NUMBER() OVER (ORDER BY BusinessEntityID) AS x, Firstname, LastName
FROM Person.Person p
) s
WHERE s.x %2 = 0
No i gotowe. Więcej podobnych przykładów poznasz na szkoleniach Microsoft. Polecam szkolenie 2778 (Microsoft Opole, Katowice, Warszawa)