Sql-Server
我可以將 SELECT TOP() 與 IN 運算符結合使用嗎?
我想知道是否有辦法對
SELECT
IN 中找到的每個匹配值進行查詢。考慮到下表包含
IN
運算符引用的每個值的 100 條記錄,我希望每次匹配只返回 50 條記錄。SELECT TOP (50) COLUMN FROM TABLE WHERE COLUMN IN (1,2,3)
有沒有一種有效的方法可以做到這一點?
我能想到的唯一方法是對每個值執行查詢,
IN
考慮到實際查詢從各種表中檢索許多列,這將太慢了。
一種方法是
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;
為了避免返回隨機行
TOP
,ORDER BY
需要 , 並且按列排序應該是唯一的。具有復合鍵的索引ID
在ColumnName
此範例查詢中將很有用,以提高效率。
您可以
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