2013-08-06 33 views
5

Dưới đây, trường hợp thứ hai của tôi không hoạt động vì tôi đang tham chiếu tên từ truy vấn phụ. Giải pháp tốt cho vấn đề này là gì? Ngoài ra, tôi tuyên bố các tham số SortBy ... chỉ cần không bao gồm trong ví dụ. Cảm ơn bạn rất nhiều về mọi mặt!Máy chủ SQL - Đặt hàng theo tên từ Subquery

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 
+0

Nó cho tôi biết tên cột không hợp lệ. SQL Server 2008 – user1447679

Trả lời

1

Thay thế:

WHEN 2 THEN [VoteCount] END DESC 

Với:

WHEN 2 THEN (SELECT COUNT(VoteID) AS VoteCount 
FROM [VoteTable] WHERE [PostID] = a.[PostID]) END DESC 
+0

Điều này thực sự làm việc ... Ví dụ của Kcoder có nên được sửa đổi không? Không nhận được bất kỳ lỗi nào. Về để nhấp vào dấu kiểm đẹp đó! – user1447679

+0

@MichaelFredrickson Có vẻ như nó đang hoạt động. Tôi vẫn đang thử nghiệm. – user1447679

+0

@MichaelFredrickson Tôi đã sửa lại rồi. Tôi đoán có một cái gì đó về cú pháp cụ thể này gây ra bí danh cột để phá vỡ. – Kcoder

2

Lặp lại biểu thức là một cách, như là đặt nó trong một subquery hoặc CTE, ví dụ:

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

Nhưng thay vì lặp lại biểu thức, nó dường như không quan trọng nếu bạn thực sự thực hiện điều kiện cho lệnh thứ hai. Vậy tại sao không chỉ đơn giản là thay đổi hiện tại của bạn ORDER BY tới:

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

Trong trường hợp này nếu @SortBy là 2, khái niệm đầu tiên là NULL, và do đó đặt mong muốn của bạn vẫn đạt được. Khi @SortBy là 1, nó được sắp xếp theo ngày giảm dần và trừ khi có nhiều mối quan hệ với Date_Created và trong trường hợp đó bạn không muốn xem các quan hệ đó được sắp xếp theo VoteCount DESC, thứ tự thứ cấp không quan trọng, vì vậy bạn không không cần bọc nó trong biểu thức CASE thứ hai. Lý do, nhân tiện, là khi bạn giới thiệu một biểu thức CASE đến ORDER BY, bạn thay đổi cách SQL Server có thể phân tích cú pháp/đánh giá truy vấn và bạn không còn có thể tham chiếu một bí danh từ danh sách SELECT nữa. Đây là lý do tại sao xóa số CASE khỏi điều khoản ORDER BY không còn phàn nàn về tên cột không hợp lệ nữa.

0
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 
Các vấn đề liên quan