TSQL - TOP X в подзапросе? - PullRequest
3 голосов
/ 08 мая 2010

Может кто-нибудь подсказать мне способ фильтрации подзапроса, который находится в предложении FROM?Я бы хотел, чтобы это выглядело примерно так:

SELECT *
FROM TABLE_A
LEFT JOIN (TOP 8 TABLE_B) ON TABLE_B.id = TABLE_A.id

Ответы [ 6 ]

17 голосов
/ 08 мая 2010

Если вам нужно сопоставить подзапрос, вам нужно использовать APPLY вместо JOIN:

SELECT *
FROM TABLE_A
CROSS APPLY (
 SELECT TOP (8) *
 FROM TABLE_B
 WHERE TABLE_B.id = TABLE_A.id
 ORDER BY ...) AS B;

Это даст вам 8 верхних рядов из B для каждой строки в A. Другие решения, которые я вижу опубликованными, дадут вам соединение между A и global TOP 8 из В * +1010 *

4 голосов
/ 08 мая 2010
SELECT * 
FROM TABLE_A AS a
LEFT JOIN (SELECT TOP 8 id, field1, field2
           FROM TABLE_b) AS b
    ON a.id = b.id

Должно работать.

2 голосов
/ 08 мая 2010

Вы можете рассмотреть другой подход, такой как:

SELECT * FROM TABLE_A WHERE TABLE_A.ID IN ( SELECT TOP 8 ID FROM TABLE_B )
2 голосов
/ 08 мая 2010
SELECT *
FROM TableA
LEFT JOIN ( SELECT TOP 8 * FROM TableB) B
   ON B.id=TableA.id
1 голос
/ 08 мая 2010

Пожалуйста, попробуйте это:

SELECT 
column_names 
FROM 
TABLE_A A LEFT JOIN (SELECT TOP 8 column_names FROM TABLE_B) as B
on A.Id=B.ID

Вопросы:

Не используйте *, так как это приведет к ограничениям производительности.

Если вас беспокоит только ID, тогда получите только ID из Table_B

НТН

0 голосов
/ 08 мая 2010

вы можете использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...