sélectionner des lignes de chaque côté d'un logging

Je veux sélectionner 4 lignes de chaque côté d'un logging d'une table d'images que j'ai.

Jusqu'à présent, j'ai ce qui suit: –

with myresults as( select mykey, imageThumb,ROW_NUMBER() OVER (ORDER BY mykey)AS Row from images where userid = @userID ) select * from myresults where row < ((select row from myresults where mykey=@imageID)+5) and row > ((select row from myresults where mykey=@imageID)-5) 

Cela fonctionne bien mais je me demandais s'il y avait une meilleure façon de le faire

Merci

En utilisant l'auto-jointure, vous pouvez facilement atteindre la cible. Essaye ça

 WITH myresults AS (SELECT Row_number() OVER ( ORDER BY mykey)AS Rn, mykey, imageThumb FROM images where userid = @userID) SELECT * FROM myresults a JOIN myresults b ON a.rn BETWEEN b.Rn - 5 AND b.rn + 5 WHERE a.mykey = @imageID 

preuve de réponse

 CREATE TABLE #images ( mykey INT, imageThumb VARCHAR(50) ); WITH cte AS (SELECT 1 AS id, Newid() AS d UNION ALL SELECT id + 1, Newid() d FROM cte WHERE id < 10) INSERT INTO #images SELECT * FROM cte; WITH myresults AS (SELECT Row_number() OVER ( ORDER BY mykey)AS Rn, mykey, imageThumb FROM #images) SELECT * FROM myresults a JOIN myresults b ON a.rn BETWEEN b.Rn - 3 AND b.rn + 3 WHERE a.mykey = 4 

Vous êtes sur la bonne voie, mais vous devez d'abord faire le row_number() , puis le where . Voici une méthode utilisant une cross join :

 with myresults as( select mykey, imageThumb, ROW_NUMBER() OVER (ORDER BY mykey) as Row from images ) select m.* from myresults m cross join (select * from myresults where where userid = @userID) u where m.row < u.row + 5 and m.row > ur - 5;