2013-12-18 36 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