10
votes

Comptez () et à gauche

Je pose un problème avec la requête qui affiche une liste de magasins avec le nombre de produits associés à celui-ci. Je joue avec des jointures gauche, etc. depuis un certain temps maintenant, mais en vain. Les tables ont les structures suivantes:

Table des magasins contenant des colonnes: ID code>, nom code> p>

Table des produits contenant des colonnes: Code>, Nom code>, Statut code>, Magasin code> p>

La requête est la suivante: P>

select s.name
       , p.name
       , count(p.id) 
from   Product as p 
       left join Shop as s on p.shop=s.id
where  p.status <> '8796107276379'
group by 
       s.id


2 commentaires

essayez de remplacer la join droite, à la place de gauche


Non, ça ne marche pas. Je reçois l'erreur suivante: Impossible de trouver (visible) Type pour Alias ​​S dans [P: Produit, s droit: boutique]. (C'est une languette de requête exclusive)


4 Réponses :


0
votes

Vous devez ajouter ou p.status est null code> à votre clause WHERE WHERE.

select s.name, p.name, count(p.id) 
from Shop s 
left join Product p on p.shop = s.id
where (p.status <> '8796107276379' OR p.status IS NULL) 
group by s.name, p.name


2 commentaires

Nope n'a pas fonctionné. Pourquoi pensez-vous que cela devrait fonctionner avec P.Status est NULL?


Vous avez dit que votre requête ne renvoie pas des magasins sans aucun produit. Sans "ou P.Status est NULL", votre clause d'où obtiendra en effet tous ces cas, car la comparaison "NULL <>" 8796107276379 "" n'est jamais vraie. NULL n'est pas égal avec quoi que ce soit (même une autre null), ni n'est pas égal à rien.



22
votes

Vous avez besoin de magasiner sur le côté gauche, car le côté droit est celui qui peut ne pas avoir de données, dans ce cas de produit.

Non seulement cela, vous avez besoin de la condition d'adhésion à gauche, de sorte que qu'il rejoint les produits sur la condition d'état et réduit simplement le produit (tout en conservant la boutique) même si l'état n'est pas souhaité. p>

select s.name
       , p.name
       , count(p.id) 
from   Shop as s
       left join Product as p on p.shop=s.id AND p.status <> '8796107276379'
group by 
       s.id, p.name


1 commentaires

J'ai trouvé de nombreux aproxes en ligne. C'est la meilleure solution. Merci de demander et de répondre.



1
votes
select s.name
       , p.name
       , count(p.id) 
from   Shop as s 
       left join Product as p on s.id=p.shop
where  p.status <> '8796107276379'
group by 
       s.id

0 commentaires

0
votes

J'ai aussi souffert de ce gotha ​​et je ne suis pas tout à fait sûr pourquoi, en plaçant le prédicat sur la Jojn elle-même plutôt que la requête principale réelle est la façon de le résoudre.

J'ai réellement documenté le tout, avant de lire ceci. J'ai utilisé un exemple simple avec deux deux petites tables, il explique que j'espère que la différence, peut-être que cela aidera

http://simpleritsolutions.com/sql/left/join/problèmes < / p>


1 commentaires

Au lieu de quitter un lien, pourriez-vous aussi poster le matériel correspondant de l'article? Sinon, le lien pourrait devenir une victime de la pourriture de lien