Sql CTE未分类
我在使用CTE的存储过程中进行排序时遇到问题。如果我不使用case语句,那么排序工作正常,但我需要能够在四列中的任意一列上进行排序 任何帮助都将不胜感激。下面是所讨论的存储过程的一段 声明@ValuationIds ValuationIdTableTypeSql CTE未分类,sql,sorting,common-table-expression,Sql,Sorting,Common Table Expression,我在使用CTE的存储过程中进行排序时遇到问题。如果我不使用case语句,那么排序工作正常,但我需要能够在四列中的任意一列上进行排序 任何帮助都将不胜感激。下面是所讨论的存储过程的一段 声明@ValuationIds ValuationIdTableType ;WITH CTE AS ( SELECT V.[Id], Registration, (ROW_NUMBER() OVER ( ORDER BY
;WITH CTE
AS
(
SELECT V.[Id], Registration, (ROW_NUMBER() OVER
(
ORDER BY
CASE WHEN @SortCol='Registration' and @Direction='DESC' then Registration END DESC,
CASE WHEN @SortCol='Registration' and @Direction='ASC' then Registration END ASC
)) AS seq
FROM [Valuation] V WITH (NOLOCK)
INNER JOIN dbo.Vehicle a ON a.Id = V.VehicleId
INNER JOIN dbo.Derivative b on b.Id = a.DerivativeId
INNER JOIN dbo.Model c on c.Id = b.ModelId
INNER JOIN dbo.ModelRange d on d.Id = c.ModelRangeId
INNER JOIN dbo.Manufacturer e on e.Id = d.ManufacturerId
LEFT JOIN dbo.Disposal f ON f.ValuationId = V.Id
CROSS APPLY (
SELECT TOP 1 *
FROM dbo.SellerAdvanceValuation savCA
INNER JOIN udf_SplitIDs(@CentreIdList) IdList
ON IdList.EntityID = savCA.CentreId
WHERE V.Id = savCA.ValuationId
ORDER BY Id DESC
) sav
WHERE [Deleted] = 0
AND f.Id IS NULL
AND COALESCE(@Registration, [Registration]) = [Registration]
AND COALESCE(@VehicleStatusId,[VehicleStatusId] ) = [VehicleStatusId]
AND COALESCE(@StartDate,sav.RequestDateTime ) <= sav.RequestDateTime
AND sav.RequestDateTime <= COALESCE(@EndDate,sav.RequestDateTime )
AND sav.Amount IS NOT NULL
AND sav.ValuationDateTime IS NOT NULL
AND sav.ValuationDateTime > @ValuationExpiryDateTime
)
INSERT INTO @ValuationIds(ValuationId)
SELECT a.Id
FROM CTE a
WHERE seq BETWEEN @StartIndex AND (@StartIndex + @MaxRows - 1)
EXEC dbo.Valuation_Get_All @ValuationIds
更新:
如果我做了下面的工作,它的工作,但我真的不想这样做。我有4列,必须对每列进行升序和降序
DECLARE @ValuationIds ValuationIdTableType
;WITH CTE
AS
(
SELECT V.[Id], Registration, (ROW_NUMBER() OVER
(
ORDER BY Registration DESC
--CASE WHEN @SortCol='Registration' and @Direction='DESC' then Registration END DESC,
--CASE WHEN @SortCol='Registration' and @Direction='ASC' then Registration END ASC
)) AS seq
FROM [Valuation] V WITH (NOLOCK)
INNER JOIN dbo.Vehicle a ON a.Id = V.VehicleId
INNER JOIN dbo.Derivative b on b.Id = a.DerivativeId
INNER JOIN dbo.Model c on c.Id = b.ModelId
INNER JOIN dbo.ModelRange d on d.Id = c.ModelRangeId
INNER JOIN dbo.Manufacturer e on e.Id = d.ManufacturerId
LEFT JOIN dbo.Disposal f ON f.ValuationId = V.Id
CROSS APPLY (
SELECT TOP 1 *
FROM dbo.SellerAdvanceValuation savCA
INNER JOIN udf_SplitIDs(@CentreIdList) IdList
ON IdList.EntityID = savCA.CentreId
WHERE V.Id = savCA.ValuationId
ORDER BY Id DESC
) sav
WHERE [Deleted] = 0
AND f.Id IS NULL
AND COALESCE(@Registration, [Registration]) = [Registration]
AND COALESCE(@VehicleStatusId,[VehicleStatusId] ) = [VehicleStatusId]
AND COALESCE(@StartDate,sav.RequestDateTime ) <= sav.RequestDateTime
AND sav.RequestDateTime <= COALESCE(@EndDate,sav.RequestDateTime )
AND sav.Amount IS NOT NULL
AND sav.ValuationDateTime IS NOT NULL
AND sav.ValuationDateTime > @ValuationExpiryDateTime
)
INSERT INTO @ValuationIds(ValuationId)
SELECT a.Id
FROM CTE a
WHERE seq BETWEEN @StartIndex AND (@StartIndex + @MaxRows - 1)
EXEC dbo.Valuation_Get_All @ValuationIds
插入@ValuationIdsValuationId 选择a.Id 来自CTE a 其中@StartIndex和@StartIndex+@MaxRows-1之间的seq 按{ColumnFromInCTE}排序
你说的分拣工作是什么意思?唯一的order by在row_number语句中。如果没有排序,那么可能变量设置不正确。如果我按注册描述排序,那么它会工作。当我使用case语句时,它不正确,你是对的。这是参数。像木偶一样,我将参数@Direction声明为varchar3而不是varchar4。哦,这是漫长的一天。感谢您的见解。除非我误解了CTE,否则我不必在您提到的“从CTE中选择”部分下订单,因为我已经在CTE中对其进行排序。问题在于案例陈述根本不起作用。我快发疯了,因为你什么都不分类。您正在创建一个名为seq的字段,但没有将其用于排序。您可以按seq将其添加到@evaluationexpirydatetime过滤器顺序之后,或者在我前面提到的地方,实际上,代码还可以。参数声明是错误的。我错误地将varchar3而不是varchar4放在了一起,因此当我尝试按降序排序时,它将不起作用。选择CTE时不需要指定排序,因为排序应用于CTE本身。