T-SQL:检索n次特定数量的行,其中n在“in”子句中定义

T-SQL:检索n次特定数量的行,其中n在“in”子句中定义,sql,sql-server,loops,cursor,Sql,Sql Server,Loops,Cursor,这个查询如何生成20个结果而不是10个 SELECT TOP 10 colA, colB, colC FROM table WHERE id in (1, 2) ORDER BY colA, colB 我希望看到id等于1的10个结果,id等于2的10个结果。我必须使用光标吗?也许union all会帮助你 SELECT TOP 10 colA, colB, colC FROM table WHERE id = 1 union all SELECT TOP 10 colA, colB, col

这个查询如何生成20个结果而不是10个

SELECT TOP 10 colA, colB, colC
FROM table
WHERE id in (1, 2)
ORDER BY colA, colB
我希望看到id等于1的10个结果,id等于2的10个结果。我必须使用光标吗?

也许union all会帮助你

SELECT TOP 10 colA, colB, colC FROM table WHERE id = 1
union all
SELECT TOP 10 colA, colB, colC FROM table WHERE id = 2 
ORDER BY colA, colB
也许大家都会帮助你

SELECT TOP 10 colA, colB, colC FROM table WHERE id = 1
union all
SELECT TOP 10 colA, colB, colC FROM table WHERE id = 2 
ORDER BY colA, colB

这样,您就不需要关心in子句中有多少ID


这样,您就不需要关心in子句中有多少ID


这不是一个答案,但它太大了,不适合评论 @Giannis,这是您的代码和示例数据。为了节省一些空间,我将10改为3

DECLARE @T TABLE (id INT, colA int, colB int)
INSERT INTO @T VALUES (1,10,20), (2, 30, 40), (1,14,23), (2, 32, 45), (1,16,28), (2, 35, 42), (1,11,27), (2, 34, 41), (1,19,23), (2, 32, 48), (1,17,26), (2, 37, 42)

;WITH MyCTE AS
(
    SELECT id, colA, 
           colB,
        ROW_NUMBER() OVER(PARTITION BY id ORDER BY colA, colB) AS rn
    FROM   @T
    WHERE id in (1, 2) 
)
SELECT *
FROM   MyCTE 
WHERE  rn<= id*3
ORDER BY colA, colB
以下是结果 可口可乐公司 1 10 20 1 1 11 27 2 1 14 23 3 2 30 40 1 2 32 45 2 2 32 48 3 2 34 41 4 2 35 42 5 237426


注意id*3给出了rn这不是一个答案,但它太大了,无法放入注释中 @Giannis,这是您的代码和示例数据。为了节省一些空间,我将10改为3

DECLARE @T TABLE (id INT, colA int, colB int)
INSERT INTO @T VALUES (1,10,20), (2, 30, 40), (1,14,23), (2, 32, 45), (1,16,28), (2, 35, 42), (1,11,27), (2, 34, 41), (1,19,23), (2, 32, 48), (1,17,26), (2, 37, 42)

;WITH MyCTE AS
(
    SELECT id, colA, 
           colB,
        ROW_NUMBER() OVER(PARTITION BY id ORDER BY colA, colB) AS rn
    FROM   @T
    WHERE id in (1, 2) 
)
SELECT *
FROM   MyCTE 
WHERE  rn<= id*3
ORDER BY colA, colB
以下是结果 可口可乐公司 1 10 20 1 1 11 27 2 1 14 23 3 2 30 40 1 2 32 45 2 2 32 48 3 2 34 41 4 2 35 42 5 237426


请注意,id*3给出了RN,您可能希望在OVER中使用与查询其余部分相同的ORDER BY条件-目前,您已将其更改为为为每个id值提供10个随机行,然后按colA、colB对它们进行排序,而原始查询是为我提供10个具有最早/最低colA的行,colB Values我想你想要的是rn@RobertSheahan Nope。OP说他想要10个id=1,另外10个id=2。所以id=2时为20。@giannis paraskevopoulos它太大了,无法放入注释中,所以我不得不添加一个答案,但查看这两个变体的实际输出,您需要删除id*您可以将CTE视为预定义的子查询。您可以在顶部定义SELECT*FROM SELECT*FROM表,并在下一个语句中使用它,而不是使用SELECT*FROM SELECT*FROM表。在CTE中,我还定义了ROW_NUMBER,它将为每一个id的每一行提供一个递增的数字。这就是分区所做的。因此,对于每个id,其第一行将有数字1,第二行将有数字2,依此类推。然后,我过滤该选择以仅获得行号小于10的行。这样我们就得到了每个组的前X。您可能希望使用与查询其余部分相同的按条件排序-目前,您已将其更改为为为每个ID值提供10个随机行,然后按colA、colB对它们进行排序,而原始查询是为我提供10个具有最早/最低colA的行,colB Values我想你想要的是rn@RobertSheahan Nope。OP说他想要10个id=1,另外10个id=2。所以id=2时为20。@giannis paraskevopoulos它太大了,无法放入注释中,所以我不得不添加一个答案,但查看这两个变体的实际输出,您需要删除id*您可以将CTE视为预定义的子查询。您可以在顶部定义SELECT*FROM SELECT*FROM表,并在下一个语句中使用它,而不是使用SELECT*FROM SELECT*FROM表。在CTE中,我还定义了ROW_NUMBER,它将为每一个id的每一行提供一个递增的数字。这就是分区所做的。因此,对于每个id,其第一行将有数字1,第二行将有数字2,依此类推。然后,我过滤该选择以仅获得行号小于10的行。这样我们就得到了每组的前X名。