2014-07-21 3 views
0

j'ai 3 tables qui ressemblent à ceci:Rejoindre 3 tables SQL

Table1: 
PersonSSN 
NumberOfCars 

Table2: 
PersonSSN 
NumberOfPhones 

Table3: 
PersonName 
PersonSSN 

Les deux Tableau 1 et Tableau 2 ont une référence clé étrangère sur Table3 PersonSSN.

J'ai besoin de joindre ces de telle sorte que je reçois: NomPersonne NumberOfPhones NumberOfCars

Voici quelques conditions applicables à la jointure:

  1. Si une personne a une entrée dans Table1 et Table2 je vois tous les 3 champs peuplés pour lui.
  2. Si une personne a une entrée dans Table1 et non Tableau2 il devrait encore apparaître, mais avec NumberOfPhones à 0.
  3. De même, si une personne a une entrée dans Tableau2 et non au tableau 1, il devrait encore apparaître, mais avec NumberOfCars défini sur 0.

Est-ce que cela peut être réalisé en une seule requête? Si oui, quelle devrait être la requête?

Répondre

6

Ceci est une requête left outer join:

select t3.name, coalesce(t1.NumberOfPhones, 0), coalesce(t2.NumberOfCars, 0) 
from table3 t3 left outer join 
    table1 t1 
    on t3.ssn = t1.ssn left outer join 
    table2 t2 
    on t3.ssn = t2.ssn; 
+0

Cela ne semble pas fonctionner. Je manque des données pour les personnes présentes dans le tableau 2 mais pas dans le tableau 1. Tout le reste semble bon. – Shan

+0

@Shan: S'il vous plaît envisager de fournir un [cas de test SQL Fiddle] (http://sqlfiddle.com/) démontrant comment cette solution ne fonctionne pas, car, autant que je peux dire, il * devrait * fonctionner. –

+0

@Shan. . . Est-ce que tous les 'SSN's dans' table3'? Cela se produirait si 'table3' ne couvre pas l'ensemble de la population dans les deux tableaux. –