开发者

TSQL - TOP X in FROM Subquery?

开发者 https://www.devze.com 2022-12-29 19:35 出处:网络
Can someone please enlighten me to a way to filter a subquery that is located in a FROM clause? I would like it to look something like this:

Can someone please enlighten me to a way to filter a subquery that is located in a FROM clause? I would like it to look something like this:

SELECT *
FROM TABLE_A
LEFT JOIN (TOP 8开发者_开发知识库 TABLE_B) ON TABLE_B.id = TABLE_A.id


If you need to correlate the subquery then you need to use APPLY instead of JOIN:

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

This will give you the top 8 rows from B for each row in A. The other solutions I see posted will give you the JOIN between A and the global TOP 8 from B


SELECT * 
FROM TABLE_A AS a
LEFT JOIN (SELECT TOP 8 id, field1, field2
           FROM TABLE_b) AS b
    ON a.id = b.id

Should work.


SELECT *
FROM TableA
LEFT JOIN ( SELECT TOP 8 * FROM TableB) B
   ON B.id=TableA.id


Please try this:

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

Considerations:

Do not use * since it would lead to performance constraints.

IF you are concerned about just the ID then get only the ID from Table_B

HTH


You might consider a different approach such as:

SELECT * FROM TABLE_A WHERE TABLE_A.ID IN ( SELECT TOP 8 ID FROM TABLE_B )


you can use an ORDER BY, and even make the TOP N use a 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

OUTPUT:

rowid       rowid
----------- -----------
1           1
2           2
3           NULL
4           NULL
5           NULL
6           NULL
7           NULL
8           NULL

(8 row(s) affected)

EDIT based on OPs comments:

The problem is that the TOP 8 of that table does not contain the ID that I am filtering in the main query.

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)
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号