[英]SQL Server - Order by name from Subquery
下面,我的第二种情况不起作用,因为我引用了子查询中的名称。 什么是这个问题的好方法? 另外,我正在声明SortBy参数......只是在示例中没有包含它。 非常感谢你的帮助!
SELECT
a.[PostID]
,a.[Title]
,a.[Date_Created]
,(SELECT COUNT(VoteID) AS VoteCount
FROM [VoteTable] WHERE [PostID] = a.[PostID]) AS VoteCount
FROM [PostTable] a
INNER JOIN [Users] b
ON a.Created_UserID = b.UserID
WHERE a.Approved = 1
ORDER BY
CASE @SortBy
WHEN 1 THEN a.[Date_Created] END DESC,
CASE @SortBy
WHEN 2 THEN [VoteCount] END DESC
重复表达式是一种方式,就像将它放在子查询或CTE中一样,例如:
;WITH cte AS
(
SELECT
a.PostID
,a.Title
,a.Date_Created
,(SELECT COUNT(VoteID)
FROM VoteTable WHERE PostID = a.PostID) AS VoteCount
FROM dbo.PostTable AS a
INNER JOIN dbo.Users AS b
ON a.Created_UserID = b.UserID
WHERE a.Approved = 1
)
SELECT PostID, Title, Date_Created, VoteCount
FROM cte
ORDER BY
CASE @SortBy
WHEN 1 THEN Date_Created END DESC,
CASE @SortBy
WHEN 2 THEN VoteCount END DESC;
但是不是重复表达式,如果你真的为第二个顺序执行条件似乎并不重要。 那么为什么不简单地将现有的ORDER BY
更改为:
ORDER BY CASE WHEN @SortBy = 1 THEN a.Date_Created END DESC,
VoteCount DESC;
在这种情况下,如果@SortBy
为2,则第一个表达式为NULL
,因此仍然可以实现所需的排序。 当@SortBy
为1时,它按日期降序排序,除非与Date_Created
有很多关系,在这种情况下你不希望看到按VoteCount DESC
排序的那些关系,所以二级顺序是无关紧要的,所以你不要不需要将它包装在第二个CASE
表达式中。
顺便说一句,原因是当您向ORDER BY
引入CASE
表达式时,您可以更改SQL Server可能解析/评估查询的方式,并且您不能再从SELECT
列表中引用别名。 这就是为什么从ORDER BY
子句中删除CASE
不再抱怨无效的列名。
更换:
WHEN 2 THEN [VoteCount] END DESC
附:
WHEN 2 THEN (SELECT COUNT(VoteID) AS VoteCount
FROM [VoteTable] WHERE [PostID] = a.[PostID]) END DESC
SELECT
a.[PostID]
,a.[Title]
,a.[Date_Created]
,V.VoteCount
FROM [PostTable] a
INNER JOIN (SELECT PostID, COUNT(VoteID) AS VoteCount GROUP BY PostID) V
ON V.[PostID] = a.[PostID]
INNER JOIN [Users] b
ON a.Created_UserID = b.UserID
WHERE a.Approved = 1
ORDER BY
CASE @SortBy
WHEN 1 THEN a.[Date_Created] END DESC,
CASE @SortBy
WHEN 2 THEN V.[VoteCount] END DESC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.