繁体   English   中英

SQL Server - 从Subquery按名称排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM