вы можете использовать ORDER BY и даже заставить TOP N использовать переменную:
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
ВЫХОД:
rowid rowid
----------- -----------
1 1
2 2
3 NULL
4 NULL
5 NULL
6 NULL
7 NULL
8 NULL
(8 row(s) affected)
РЕДАКТИРОВАТЬ на основе OPкомментарии:
Проблема в том, что TOP 8 этой таблицы не содержит идентификатора, который я фильтрую в основном запросе.
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<=@z
OUTPUT:
rowid rowid RowNumber
----------- ----------- --------------------
6 6 1
7 7 2
(2 row(s) affected)