Je suis juste un peu coincé avec du SQL. Je ne pense pas que je puisse formuler la question avec brio - alors laissez-moi vous montrer.
J'ai deux tables, une appelée personne, une appelée rendez-vous. J'essaie de renvoyer le nombre de rendez-vous qu'une personne a (y compris si elle en a zéro). Le rendez-vous contient le person_id
et il y en a un person_id
par rendez-vous. Il en COUNT(person_id)
va de même pour une approche sensée.
La requête:
SELECT person_id, COUNT(person_id) AS "number_of_appointments"
FROM appointment
GROUP BY person_id;
Renvoie correctement, le nombre de rendez-vous d'un person_id. Cependant, une personne qui n'a pas de rendez-vous n'est pas renvoyée (évidemment car elle ne figure pas dans ce tableau).
Ajuster l'instruction pour prendre person_id de la table person me donne quelque chose comme:
SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM appointment
JOIN person ON person.person_id = appointment.person_id
GROUP BY person.person_id;
Cependant, cela ne renverra toujours qu'un person_id qui a un rendez-vous et non ce que je veux qui est un retour avec des personnes qui ont 0 rendez-vous!
Des suggestions s'il vous plaît?
la source
Réponses:
Vous voulez une jointure externe pour cela (et vous devez utiliser la personne comme table de "conduite")
La raison pour laquelle cela fonctionne, c'est que la jointure externe (gauche) reviendra
NULL
pour les personnes qui n'ont pas de rendez-vous. La fonction d'agrégationcount()
ne comptera pas lesNULL
valeurs et vous obtiendrez ainsi un zéro.Si vous voulez en savoir plus sur les jointures externes, voici un joli tutoriel: http://sqlzoo.net/wiki/Using_Null
la source
Vous devez utiliser à la
LEFT JOIN
place deINNER JOIN
la source
si vous faites la jointure externe (avec le nombre), puis utilisez ce résultat comme sous-table, vous pouvez obtenir 0 comme prévu (grâce à la fonction nvl)
Ex:
la source
Utilisez la jointure pour obtenir 0 compte dans le résultat en utilisant GROUP BY.
il suffit de «rejoindre» pour faire une jointure interne dans MS SQL, donc, optez pour une jointure gauche ou droite.
Si la table qui contient la clé primaire est mentionnée en premier dans la requête, utilisez la jointure GAUCHE sinon la jointure DROITE.
PAR EXEMPLE:
.
Prenez group by de la table qui a la clé primaire et comptez à partir de l'autre table qui a des entrées / détails réels.
la source
Pour modifier encore moins votre requête d'origine, vous pouvez transformer votre jointure en
RIGHT
jointureCela se base uniquement sur la réponse sélectionnée, mais comme la jointure externe est dans la
RIGHT
direction, un seul mot doit être ajouté et moins de changements. - N'oubliez pas qu'il est là et peut parfois rendre les requêtes plus lisibles et nécessiter moins de reconstruction.la source
Le problème avec une jointure à gauche est que s'il n'y a pas de rendez-vous, il renverra toujours une ligne avec un null, qui, une fois agrégée par COUNT, deviendra 1, et il apparaîtra que la personne a un rendez-vous alors qu'elle n'en a pas. Je pense que cela donnera les bons résultats:
la source