5

以下の 2 番目のケースは、サブクエリから名前を参照しているため機能しません。この問題の良い解決策は何ですか? また、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
4

3 に答える 3

2

サブクエリまたは CTE に式を配置するのと同様に、式を繰り返すのも 1 つの方法です。たとえば、次のようになります。

;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;

しかし、式を繰り返す代わりに、実際に 2 次 by の条件を実行するかどうかは問題ではないようです。では、単に既存のORDER BYものを次のように変更してみませんか。

ORDER BY CASE WHEN @SortBy = 1 THEN a.Date_Created END DESC,
         VoteCount DESC;

この場合、 if@SortByは 2 で、最初の式はNULLであるため、目的の順序付けは引き続き実現されます。が 1 の場合@SortBy、日付の降順で並べ替えられます。 との同点が多くDate_Created、その場合、 でソートされた同点を表示したくないVoteCount DESC場合を除き、 による 2 番目の順序は重要ではないため、ラップする必要はありません。それを第二のCASE表現で。

CASEちなみに、式を に導入すると、SQL Server がクエリを解析/評価する方法が変更され、リストORDER BYからエイリアスを参照できなくなるためです。これが、句から をSELECT削除しても、無効な列名について文句を言わなくなった理由です。CASEORDER BY

于 2013-08-06T23:55:16.123 に答える