SELECT DISTINCT et COMMANDE PAR
Si je place mot clé DISTINCT, j'obtiens une erreur d'autres sages, il fonctionne très bien.
ERREUR: Msg 145, Niveau 15, État 1, Procédure SP_Products_GetList, la Ligne 15
COMMANDE PAR éléments doivent apparaître dans la liste de sélection si SELECT DISTINCT est spécifié.
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
Qui veut trouver l'aiguille?
Juste un conseil: essayez d'éviter d'utiliser SELECT * pour des raisons de performances...
Thnx pour la suggestion
Juste un conseil: essayez d'éviter d'utiliser SELECT * pour des raisons de performances...
Thnx pour la suggestion
OriginalL'auteur SOF User | 2010-08-09
Vous devez vous connecter pour publier un commentaire.
Ce qui se passe si vous ne...
OriginalL'auteur Yves M.
Donc, un couple de choses ici. Je ne dis pas que je suis absolument certain que ce sont droit, mais quelques choses à considérer.
Ce message s'affiche généralement lorsque vous ne fournissez pas votre commande par colonne dans le select distinct de la liste. Le seul problème que j'ai pu voir ici, c'est que depuis [Prix] est l'alias de Max(Prix), il est peut-être confus? Essayez de spécifier Max(Prix) dans la dynamique des clauses order by vous sont bâtiment au fond.
J'ai remarqué que votre bon de commande dynamique par pourrait potentiellement avoir un couple de différents types retourné. En général, vous voulez garder ces clauses order by de travail avec le même type de données. Cependant, il semble que vous séparés les types de tri (produit id & prix qui je pense sont de type numérique et le nom du produit qui je suppose est un varchar).
Donc, passons à 2, mais donner 1 coup.
Utilisateur @jkc répondu à cette question... je viens de l'a édité.
OriginalL'auteur jkc
J'ai rencontré ce même problème lorsque vous essayez de commande par un calcul sur ma table (j'ai essayé à l'ordre par la distance d'un enregistrement en fonction de la latitude et de la longitude colonnes).
Je reçois le message d'erreur même si j'inclus la latitude et la longitude des colonnes dans mon select.
J'ai trouvé cela a fonctionné si j'inclus le même calcul dans ma sélectionnez:
OriginalL'auteur gabeodess
Veuillez essayer avec la syntaxe suivante
SELECT DISTINCT (Products.ProductID), ProductName, MAX(Price) Price,
Syntaxe précédente est de vous donner l'erreur parce que vous avez utilisé la colonne
Products.ProductID
de nombreuses fois dans une procédure.Que j'ai rencontré le même problème que beaucoup de nombreuses fois. Donc, deux solutions n'a fonctionné pour moi. S'il vous plaît essayer avec votre procédure que j'ai pas le bon schéma pour le tester.
OriginalL'auteur Ashay
Une solution pour contourner
DISTINCT
serait comme suit:OriginalL'auteur FindOut_Quran