vous pouvez utiliser un ORDER BY, et même faire le TOP N utiliser une variable:
declare @x table (rowid int)
declare @y table (rowid int)
INSERT @x (rowID) SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8
INSERT @y (rowID) SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8
DECLARE @z int
SET @z=2
SELECT
a.*, b.*
FROM @x a
LEFT JOIN (SELECT TOP (@z)
*
FROM @y
ORDER BY rowid
) b ON a.rowid=b.rowid
SORTIE:
rowid rowid
----------- -----------
1 1
2 2
3 NULL
4 NULL
5 NULL
6 NULL
7 NULL
8 NULL
(8 row(s) affected)
EDIT basé sur OPs commentaires:
Le problème est que le TOP 8 de cette table ne contient pas l'ID que je am filtrage dans la requête principale.
declare @x table (rowid int)
declare @y table (rowid int)
INSERT @x (rowID) SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8
INSERT @y (rowID) SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
DECLARE @z int
SET @z=2
SELECT
a.*, b.*
FROM @x a
LEFT JOIN (SELECT
*, ROW_NUMBER() OVER(ORDER BY rowid) AS RowNumber
FROM @y
) b ON a.rowid=b.rowid
WHERE b.RowNumber<[email protected]
SORTIE:
rowid rowid RowNumber
----------- ----------- --------------------
6 6 1
7 7 2
(2 row(s) affected)
Vous devriez changer la réponse acceptée à Remus Rusanu. Raja donne la mauvaise réponse en général. – N8allan