IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

3 query imbriquées, renvoit une erreur Only one expression can be specified in the select list when the subque [2008]


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 3
    Points : 4
    Points
    4
    Par défaut 3 query imbriquées, renvoit une erreur Only one expression can be specified in the select list when the subque
    Bonjour

    J'essaye d'afficher des produits que d'autre clients aurait acheter en rapport avec mon produit courant ( typiquement la fonctionnalité "Les clients ayant acheté cet article ont également acheté" d'amazon)
    Pour ce faire j'ai 3 tables
    Product_Catalogue : contenant des produits
    Purchase : Contient les différentes infos liées à une commande
    Purchase_Product : Produit acheté par le client contenant 2 colonnes
    PID : ID de référence a la table Product_Catalogue
    PUID : ID de reférence a la table Purchase

    Via la query ci-dessous j'arrive à obtenir la liste des produits les plus commandés en rapport avec le produit courant et lié aux commandes des clients ( trié par produit les plus achetés )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TOP 10 [PID], COUNT(*) FROM Purchase_Product 
    WHERE PUID in (SELECT PUID FROM Purchase_Product WHERE PID = 379321) 
    GROUP BY [PID] ORDER BY COUNT(*) DESC
    Mon problème est lorsque je veux récupérer les produits basé sur la liste de PID qui m'est retourné via la query ci-dessus j'ai l'erreur suivante:
    Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
    Pour etre franc je suis pas spécialiste de SQL et donc je sèche un peut sur cette erreur,
    bien que je comprenne que je ne peux pas imbriquer 2 query, je ne sais pas comment résoudre ce probleme.

    Voici ma query globale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT p.PDate, PC.*, PF.Name AS FamilyName
    	FROM Purchase_Product AS PP
    	INNER JOIN dbo.Product_Catalogue AS PC ON PP.[PID] = PC.[ID]
    	INNER JOIN dbo.Purchase AS P ON PP.[PUID] = P.[ID]
    	LEFT OUTER JOIN dbo.Product_Family AS PF ON PC.FID = PF.FID 
    	WHERE PP.PID in 
    		(SELECT TOP 10 [PID], COUNT(*) FROM Purchase_Product 
    			WHERE PUID in (SELECT PUID FROM Purchase_Product WHERE PID = 379321)
    			AND PID != 379321
    			GROUP BY [PID] ORDER BY COUNT(*) DESC) 
    	AND PC.[IsDeleted] = 0
    	ORDER BY PC.[IsHightlighted] DESC, PC.[IsAvailable] DESC,p.[PDate] DESC
    D'avance merci

    Gauthier

  2. #2
    Invité
    Invité(e)
    Par défaut
    Essaie-ça pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT p.PDate, PC.*, PF.Name AS FamilyName
    FROM Purchase_Product AS PP
    INNER JOIN dbo.Product_Catalogue AS PC ON PP.[PID] = PC.[ID]
    INNER JOIN dbo.Purchase AS P ON PP.[PUID] = P.[ID]
    LEFT OUTER JOIN dbo.Product_Family AS PF ON PC.FID = PF.FID 
    WHERE PP.PID IN 
    	(SELECT TOP 10 [PID], COUNT(*) as qte
    	FROM Purchase_Product 
    		WHERE PUID IN (SELECT PUID FROM Purchase_Product WHERE PID = 379321)
    		AND PID != 379321
    		GROUP BY [PID] ORDER BY COUNT(*) DESC) 
    AND PC.[IsDeleted] = 0
    ORDER BY PC.[IsHightlighted] DESC, PC.[IsAvailable] DESC,p.[PDate] DESC
    Je pense que c'est à cause du COUNT(*) qui fait que l'on a une sortie non nommée dans la requête.
    Avec l'alias, ça devrait contrer le problème.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Sans trop modifier votre requete initiale, il suffit d'enlever votre COUNT du SELECT dans la sous requete (laissez le simplement dans le ORDER BY)

    Sinon, vous pouvez aussi faire une jointure plutôt qu'un IN sur votre sous requete.

    Enfin, je pense que vous pourriez réécrire votre requete, notamment avec des fonctions de fenêtrage.

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    en effet supprimer le count était la solution, je vais tenter la jointure

    Un grand merci a tous..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/04/2012, 22h03
  2. Réponses: 4
    Dernier message: 25/04/2011, 14h58
  3. Réponses: 1
    Dernier message: 04/04/2011, 23h16
  4. Réponses: 6
    Dernier message: 17/03/2011, 23h27
  5. Remplacer une query imbriqué sous mySQL 4.01
    Par brousaille dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/01/2006, 19h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo