2013-12-18 34 views
0

我有这个疑问,几乎让我想:TSQL排序依据偏移问题

SET NOCOUNT ON 

SELECT D.Id from MtdMdl_HierarchicalObject D 
where D.Name LIKE '%R%' 

SELECT B.* FROM MtdMdl_Item A 
OUTER apply (SELECT * FROM MtdMdl_Item as C where a.Id=c.Id) as B 
WHERE A.Owner in 
(
    SELECT D.Id from MtdMdl_HierarchicalObject D 
    where D.Name LIKE '%R%' 
) 
order by Id offset 0 ROWS FETCH NEXT 3 ROWS ONLY 
GO 

不幸的是我想的订单来自序号获取新的每个对象上应用3行通过返回:

SELECT D.Id from MtdMdl_HierarchicalObject D 
where D.Name LIKE '%R%' 

因为当前脚本对前一个语句的整个结果应用了Paging。

回答

1

如果你没有跳过任何一行,只得到3行,为什么还要使用OFFSET?只是使用TOP子句

SELECT B.* 
FROM MtdMdl_Item A OUTER APPLY 
        (SELECT TOP 3 * 
        FROM MtdMdl_Item 
         where Id= a.Id) as B 
WHERE A.Owner in 
(
    SELECT D.Id from MtdMdl_HierarchicalObject D 
    where D.Name LIKE '%R%' 
) 
order by Id 

在这种情况下,你可以做这样的事情......

SELECT * FROM 
(
SELECT B.*, A.ID , RN = ROW_NUMBER() OVER (PARTITION BY A.ID ORDER BY A.ID) 
FROM MtdMdl_Item A OUTER APPLY 
        (SELECT * 
        FROM MtdMdl_Item 
         where Id= a.Id) as B 
WHERE A.Owner in 
(
    SELECT D.Id from MtdMdl_HierarchicalObject D 
    where D.Name LIKE '%R%' 
) 
order by Id 
) Q 
WHERE RN >= LowerList AND RN <= UpperLimit 
+0

我猜OP希望新的3行对每个数据库往返,简单的把一个顶生病返回相同3排。如果我的猜测是正确的,那么生病需要保持并传递某种从应用程序到查询的StartFromRow_N参数。 – jean

+0

@jean ID OFFSET 0意味着OP不会跳过任何行。所以使用TOP子句而不是OFFSET会更有意义。 –

+0

这是我的错,在这种情况下,偏移量为0,但真正的意图是使用分页,所以我可以有非零偏移量。 – Nock