2010-08-09 108 views
4

如果我放置DISTINCT关键字,我得到一个错误,其他明智的是它工作正常。SELECT DISTINCT和ORDER BY

错误:消息145,级别15,状态1,过程SP_Products_GetList,行15 如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中。

ALTER PROCEDURE [dbo].[SP_Products_GetList]  

@CatID int, 
@CatName int, 
@IsNew bit, 
@InActive bit, 
@SortBy varchar(50), 
@SortType varchar(50) 

AS  

SELECT DISTINCT Products.ProductID, ProductName, MAX(Price) Price, PriceID, [Description], Size, IsNew, InActive FROM (SELECT * FROM Products WHERE (@InActive is null or @InActive = InActive ) AND (@IsNew is null or @IsNew = IsNew)) Products 
    INNER JOIN ProductCategory 
     on Products.ProductID = ProductCategory.ProductID 
    INNER JOIN (
        SELECT * FROM Categories 
         WHERE 
          (@CatID is null or @CatID = CatID) and 
          (@CatName is null or @CatName = CatName) 
       ) Categories 
     on ProductCategory.CatID = Categories.CatID 
    INNER JOIN ( 
        SELECT Prices.ProductID, Prices.Price, Prices.PriceID, Prices.SizeID FROM Prices 
         INNER JOIN (
          SELECT ProductID, max(Price) Price from Prices WHERE PriceID IN 
            (SELECT MAX(PriceID) FROM Prices 
            GROUP BY ProductID , SizeID) 
          GROUP BY ProductID) Prices_ 
         ON Prices.ProductID = Prices_.ProductID AND Prices.Price = Prices_.Price      
       ) as Prices 
     on Prices.ProductID = Products.ProductID 
     inner join Sizes 
     on Sizes.SizeID = Prices.SizeID 
GROUP BY ProductName, CatName, Products.ProductID, Price, PriceID, [Description] ,Size, IsNew,InActive 
ORDER BY 
CASE @SortType 
    WHEN 'desc' THEN 
    CASE @SortBy   
     WHEN 'ProductName' THEN ProductName   
     END 
    END 
    DESC, 
CASE @SortType 
    WHEN 'desc' THEN 
    CASE @SortBy   
     WHEN 'ProductID' THEN Products.ProductID 
     WHEN 'Price' THEN Price   
     END 
    END 
    DESC,  
CASE @SortType 
    WHEN 'asc' THEN 
    CASE @SortBy   
     WHEN 'ProductName' THEN ProductName   
     END 
    END 
    ASC, 
CASE @SortType 
    WHEN 'asc' THEN 
    CASE @SortBy   
     WHEN 'ProductID' THEN Products.ProductID 
     WHEN 'Price' THEN Price   
     END 
    END 
    ASC 
+0

谁愿意找针? – Nix 2010-08-09 12:22:29

+0

只是一个提示:尽量避免使用SELECT *出于性能原因... – 2010-08-09 12:23:05

+0

thnx建议 – 2010-08-09 12:50:44

回答

12

如果你这样做,会发生什么......

SELECT ProductID, ProductName... 
FROM (
     SELECT DISTINCT Products.ProductID, ProductName... 
) AS OrderProduct 
ORDER BY [your order code...] 
+0

这是一个很好的做法吗? – HaBo 2014-10-09 18:36:05

0

请使用以下语法

SELECT DISTINCT (Products.ProductID), ProductName, MAX(Price) Price,

以前的语法是给你的错误,因为你已经在过程中使用的列Products.ProductID多次尝试。

我多次遇到同样的问题。所以,上面的解决方案已经为我工作。请尝试与您的过程,因为我没有适当的架构来测试它。

+0

@Nix感谢您的建议,但它不工作,我尝试过。 – 2010-08-09 12:41:10

3

所以,这里有两件事情。我并不是说我绝对相信这些是正确的,但需要考虑一些事情。

  1. 此消息通常在您不按选择明确列表中的列提供您的订单时显示。我在这里可以看到的唯一问题是,因为[价格]是Max(Price)的别名,所以它可能会被混淆?请尝试按照您在底部构建的子句以动态顺序指定Max(Price)。

  2. 我注意到你的动态顺序可能会有几个不同的类型返回。您通常希望通过使用相同数据类型的子句来保持这些顺序。但是,它看起来像你分开排序类型(产品编号&价格,我猜是数字和产品名称,我会认为是一个varchar)。

所以,没关系2,但给1一枪。

+0

@Nix Thanx亲爱的,但我测试了这两个选项。这不是解决问题。但Yves M.先生已经给出了解决方案 – 2010-08-09 12:44:36

+0

@SOF User @jkc回答了这个问题......我刚刚编辑它。 – Nix 2010-08-09 14:02:40

1

当我试图通过我的表上的计算(我试图根据经度和纬度列的记录距离排序)进行排序时遇到了同样的问题。

即使我在我的选择中包含纬度和经度列,我也会得到该错误。

,我发现它的工作,如果我包含在我的选择同样的计算:

SELECT DISTINCT ProductID, ProductName, ({my calculation}) AS distance 
FROM my_table 
ORDER BY {my calculation} ASC 
0

一个解决方案来解决DISTINCT情况如下:

SELECT productName, productPrice 
FROM Product 
GROUP BY productName, productPrice 
ORDER BY productName