Sql-Server

我可以將 SELECT TOP() 與 IN 運算符結合使用嗎?

  • May 5, 2019

我想知道是否有辦法對SELECTIN 中找到的每個匹配值進行查詢。

考慮到下表包含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;

為了避免返回隨機行TOPORDER BY需要 , 並且按列排序應該是唯一的。具有復合鍵的索引IDColumnName此範例查詢中將很有用,以提高效率。

您可以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

引用自:https://dba.stackexchange.com/questions/237418