我可以将 SELECT TOP() 与 IN 运算符结合使用吗?

Abs*_*Abs 7 sql-server sql-server-2012 greatest-n-per-group

我想知道是否有办法对SELECTIN 中找到的每个匹配值进行查询。

考虑到下表包含IN运算符引用的每个值的 100 条记录,我希望每次匹配只返回 50条记录。

SELECT TOP (50) COLUMN 
FROM TABLE 
WHERE COLUMN IN (1,2,3)
Run Code Online (Sandbox Code Playgroud)

有没有一种有效的方法可以做到这一点?

我能想到的唯一方法是对每个值执行查询,IN考虑到实际查询从各种表中检索许多列,这将太慢。

Dan*_*man 10

一种方法是CROSS APPLY

SELECT top_50.ColumnName
FROM (VALUES(1),(2),(3)) AS id_list(ID)
CROSS APPLY(SELECT TOP(50) t.ColumnName 
    FROM TableName AS t 
    WHERE t.ID = id_list.ID 
    ORDER BY t.ColumnName) AS top_50;
Run Code Online (Sandbox Code Playgroud)

为了避免使用TOP,返回随机行,ORDER BY并且按列排序应该是唯一的。与复合键的索引IDColumnName将在此效率例如查询是有用的。


Sal*_*n A 6

您可以ROW_NUMBER()为此使用:

SELECT a, b, c
FROM (
    SELECT a, b, c, ROW_NUMBER() OVER (PARTITION BY match_column ORDER BY d) AS rn
    FROM t
    WHERE match_column IN (1, 2, 3)
) AS x
WHERE rn <= 50
Run Code Online (Sandbox Code Playgroud)