2009-05-14 8 views
0

je les deux tableaux suivants (simplifiés pour cette question):Affichage de données à valeur nulle dans une requête SQL?

CREATE TABLE team (
teamID CHAR(6) NOT NULL PRIMARY KEY); 

CREATE TABLE member (
memberID CHAR(7) NOT NULL PRIMARY KEY, 
teamID CHAR(6) NOT NULL REFERENCES team(teamID)); 

j'ai aussi la requête suivante, qui est à la liste le nombre de membres dans chaque équipe:

SELECT teamID, count(memberID) AS [noOfMembers] 
FROM member 
GROUP by teamID; 

Cependant, J'ai quatre équipes (MRT1, MRT2, MRT3 et MRT4). Mes membres dans ma table n'appartiennent à des équipes 2 et 3, donc quand je lance la requête que je reçois la sortie suivante:

MRT2: 7, MRT3: 14

Je ne sais pas comment je peux régler ma requête à la liste les 4 équipes comme ceci:

MRT1: 0, MRT2: 7, MRT3: 14, MRT4: 0

Je suis de jouer avec les sous-requêtes pour résoudre ce problème sans chance. Des idées? Merci

Répondre

5

Essayez de choisir de join-équipe a quitté ING membre

SELECT Team.Teamid, count(memberid) 
FROM 
    TEAM 
LEFT OUTER JOIN 
    Member on Member.teamid = Team.Teamid 
GROUP by Team.Teamid 

Juste pour vous donner quelques informations sur ce que cela fait.

Il dit

Donnez-moi tous teamids de l'équipe et pour chacun compter les matches de la table membre même s'il n'y a pas des allumettes.

si vous utilisez

SELECT Team.Teamid, count(memberid) 
FROM 
    TEAM 
INNER JOIN 
    Member on Member.teamid = Team.Teamid 
GROUP by Team.Teamid 

cela se traduit

Donnez-moi tous teamids de l'équipe et pour chacun compter les matches de la table des membres, mais seulement s'il y a des matches.

+0

C'est super, très instructif, merci. Une question - quelle serait la différence entre un LEFT JOIN et un LEFT OUTER JOIN? Dans ce cas, je ne vois pas de différence, mais je suis sûr qu'il y en a une. – StormPooper

+1

Il n'y a pas de différence entre LEFT OUTER et LEFT. Ou INNER JOIN et JOIN pour cette question. –

0

Une jointure à droite à la table TEAM devrait résoudre le problème.

3
SELECT teamID, count(memberID) AS [noOfMembers] 
FROM team 
LEFT JOIN member 
ON team.teamID = member.teamID 
GROUP by teamID; 
2

Je l'ai fait l'essai et a travaillé pour moi

CREATE TABLE team (
teamID CHAR(6) NOT NULL PRIMARY KEY); 

CREATE TABLE member (
memberID CHAR(7) NOT NULL PRIMARY KEY, 
teamID CHAR(6) NOT NULL REFERENCES team(teamID)); 

INSERT INTO team (teamID) VALUES ('T1') 
INSERT INTO team (teamID) VALUES ('T2') 
INSERT INTO team (teamID) VALUES ('T3') 
INSERT INTO team (teamID) VALUES ('T4') 

INSERT INTO member (memberID, teamID) VALUES ('M1', 'T1') 
INSERT INTO member (memberID, teamID) VALUES ('M2', 'T1') 
INSERT INTO member (memberID, teamID) VALUES ('M3', 'T1') 
INSERT INTO member (memberID, teamID) VALUES ('M4', 'T3') 

SELECT Team.teamID, count(member.memberID) AS [noOfMembers] 
FROM Team LEFT JOIN member ON Member.teamID = Team.teamID 
GROUP BY ALL Team.teamID; 
Questions connexes