Inloggen
 
 
 
 
    
Nieuwe functies in SQL 2005 - ROW_NUMBER
Location: BlogsFerry Onderwater - Developer    
Posted by: Ferry Onderwater 7-2-2006 0:00
Vóór SQL 2005 was het erg lastig om bijvoorbeeld het volgende te doen: Geef mij het 11e tot en met het 20e record uit een subset (voor paging of iets dergelijks). Of: gooi alle records die aan een criteria doen weg behalve de nieuwste 10. In dit korte item laat ik zien aan de hand van de laatste vraag hoe je dit in SQL 2005 kunt doen.

De uitdaging is om van een rij records alles behalve de nieuwste 'x' (stel 9) weg te gooien.
In SQL 2005 zit de functie 'ROW_NUMBER'.
ROW_NUMBER heeft altijd een parameter nodig, namelijk hoe en waaraan de rijnummers moeten worden toegekend. In ons geval willen we de data niet verder splitsen (partitioneren) maar 'gewoon' nummers toekennen aan de rijen in een bepaalde volgorde. Dit kunnen we doen door als parameter (ORDER BY ) te geven.
Dus met dat in het achterhoofd schreef ik de volgende code:

Code:
DELETE FROM tblHistory WHERE ROW_NUMBER() OVER (ORDER BY Created DESC) >= 10

Dat werkt dus niet Sad Je krijgt gelijk de foutmelding 'Windowed functions can only appear in the SELECT or ORDER BY clauses.' om je oren.

Het blijkt dat we ROW_NUMBER alleen kunnen gebruiken in een SELECT-statement óf in een ORDER BY.
Gelukkig heeft SQL 2005 nóg een stukje nieuwe functionaliteit,  WITH - AS.

Met WITH AS kunnen we een soort virtuele tabel maken. Microsoft noemt het een 'temporary named result set', of ook een 'common table expression'. Deze vullen we met een query, dus gewoon een SELECT. En dáár kan zoals we net gezien hebben wél de ROW_NUMBER functionaliteit gebruikt worden.
Op deze virtuele tabel mogen we SELECT, INSERT, UPDATE en DELETE statements loslaten. Als we deze informatie bij elkaar plaatsen kunnen we de volgende code creeeren:

Code:
WITH OrderedHistory AS (SELECT ROW_NUMBER() OVER(ORDER BY Created DESC) AS RowNumber, guid FROM tblHistory)
    DELETE FROM OrderedHistory WHERE RowNumber >= 10


Veel plezier!
Copyright ©2006 Ferry Onderwater
Permalink |  Trackback
  
 
Weblogs
    
Archief
    
Zoeken
    
 
 
 
 
Copyright 2006-2009 by Arcencus
Privacy Statement | Terms Of Use