Posts
265
Comments
80
Trackbacks
4
Fun mit SQL: Distinct und RowNumber

Im SQL-Server lassen sich die gefundenen Ddatensätze mit Rownumber nummerieren. Diese Funktion kann man z.B. für Paging-Funktionen verwenden:

WITH Result AS
(
SELECT *,ROW_NUMBER()
OVER (ORDER BY [Tabelle].[Feld1]) AS RowNumber
FROM [Tabelle]
INNER JOIN ...
INNER JOIN ...
)
SELECT * FROM Result WHERE RowNumber>=0 AND RowNumber<=20

Wenn das Suchergebnis, z.B. auf Grund von inner Joins, doppelte Ergebnisse zurückgibt ud man diese doppelten Egebnisse mit DISTINCT unterdrücken will, dann stellt man fest, das ROWNUMBER den Befehl DISTINCT ignoriert.  Die Dubletten werden weiterhin - trotz DISTINCT - schön durchnummeriert:

WITH Result AS
(
SELECT DISTINCT *,ROW_NUMBER()
OVER (ORDER BY [Tabelle].[Feld1]) AS RowNumber
FROM [Tabelle]
INNER JOIN ...
INNER JOIN ...
)
SELECT * FROM Result WHERE RowNumber>=0 AND RowNumber<=20

Um dies zu umgehen kann man mit einer weiteren Zwischentabelle (CTE) arbeiten:

WITH Result AS
(
SELECT DISTINCT * FROM [Tabelle]
INNER JOIN ...
INNER JOIN ...
),
Result2 AS
(
SELECT *,ROW_NUMBER() OVER (ORDER BY Name) AS RowNumber
FROM SearchResult
)
SELECT * FROM Result2 WHERE RowNumber>=0 AND RowNumber<=20

Erst in Result2 werden die in Result1 - ohne Dubletten - gefundenen Datensätze mit einer ROWNUMBER versehen.

Mit dem letzten Select schliesslich kann auf dieses Suchergebnis, das ohne Dubletten und mit einer Rownumber versehen ist, zugegriffen werden.

posted on Friday, August 31, 2007 6:21 AM Print
Comments
No comments posted yet.

Post Comment

Title *
Name *
Email
Url
Comment *  
Please add 1 and 7 and type the answer here: