这是我的查询:
DECLARE @StartRow INT
DECLARE @PageSize INT
SET @StartRow = 1
SET @PageSize = 5
SELECT ContractID,Property FROM
(
SELECT c.ContractID,
Property =
(
SELECT TOP 1 p.Name
FROM Com.Property p
JOIN VContract.Contract2Property c2p ON c2p.PropertyID=p.PropertyID
WHERE c2p.ContractID=c.ContractID
),
ROW_NUMBER() OVER (ORDER BY Property) as RowNum
FROM VContract.[Contract] c
) as sub
WHERE RowNum BETWEEN @StartRow AND ((@StartRow + @PageSize) - 1)
Run Code Online (Sandbox Code Playgroud)
问题是(ORDER BY Property)部分.我可以通过c.ContractID而不是Property来订购.那么如何才能实现这一目标呢?我需要查找属性的名称,然后我希望按该名称排序.
这用于填充网站,因此分页对我很重要,因此我可以限制一次返回多少条记录.
谢谢你的帮助.
尝试将您的呼叫转移到ROW_NUMBER()到您的外部查询:
SELECT ContractID, Property, ROW_NUMBER() OVER (ORDER BY Property) as RowNum FROM
(
SELECT c.ContractID,
Property =
(
SELECT TOP 1 p.Name
FROM Com.Property p
JOIN VContract.Contract2Property c2p ON c2p.PropertyID=p.PropertyID
WHERE c2p.ContractID=c.ContractID
),
FROM VContract.[Contract] c
) as sub
Run Code Online (Sandbox Code Playgroud)
请注意,您可能必须将where子句拉出到另一层嵌套.
小智 5
我认为当使用带有 CTE 概念的子查询时,您将克服这个问题
WITH VContract AS
(
SELECT ROW_NUMBER() OVER (ORDER BY Property) as RowNum, ContractID
FROM
(
SELECT c.ContractID AS ContractID,
Property =
(
SELECT TOP 1 p.Name
FROM Com.Property p
JOIN VContract.Contract2Property c2p ON c2p.PropertyID=p.PropertyID
WHERE c2p.ContractID=c.ContractID
)
FROM VContract.[Contract] c
)
)
SELECT ContractID FROM VContract
WHERE RowNum BETWEEN @StartRow AND ((@StartRow + @PageSize) - 1)
Run Code Online (Sandbox Code Playgroud)