2010-07-21 3 views
0

J'ai peut-être mal compris le bout du manche, mais je pensais qu'une jointure externe était supposée me donner tous les enregistrements qui se trouvaient dans la table (disons) gauche, avec la correspondance résultats de la table de droite, et les nulls où il n'y avait pas de correspondance.Tableau multiple Problème de jointure externe

J'ai 3 tables que j'ai besoin d'interroger. Personne et détail ont une relation directe 1: 1. Le troisième tableau est le temps. Cela stocke les heures travaillées sur une base hebdomadaire, par personne, par projet. J'ai besoin d'un compte du nombre de semaines que chaque personne a mis à.

Ce qui suit me donne le nombre de semaines que chaque utilisateur a mis le temps jusqu'à aussi longtemps qu'ils ont mis bas> 1 semaine

SELECT name, detail.clock, COUNT(DISTINCT(week)) 
FROM person, detail,  
WHERE person.ref = detail.person 
AND detail.clock = time.clock 
WHERE time.week >= "2010-07-01" 
GROUP BY detail.clock 

-à-dire ce montrera les 80/100 personnes qui ont heure entrée.

Cependant, je besoin de voir ces 20 personnes qui ont pas le temps encore mis bas, alors j'ai essayé l'extérieur suivant rejoindre

SELECT name, detail.clock, COUNT(DISTINCT(week)) 
FROM person LEFT OUTER JOIN detail ON person.ref = detail.person 
LEFT OUTER JOIN time ON detail.clock = time.clock 
WHERE time.week >= "2010-07-01" 
GROUP BY detail.clock 

Cependant, cela me donne exactement le même résultat que la première requête.

EDIT: Je viens de découvrir une partie du problème. Dans la version originale du pseudo code il n'y avait pas de flittering par date. Je viens de découvrir que le fait de supprimer le filtre de date fait que la requête se comporte plus comme prévu - bien que trop lente pour être utile, et la date est importante.

Répondre

Questions connexes