2010-08-10 7 views
13

J'ai une base de données SQL qui contient plusieurs tables relationnelles. Certains champs de la table principale référencent plusieurs fois une autre table. Par exemple, disons que j'ai une base de données de vendeurs qui sont responsables des ventes pour plusieurs états. Ma base de données contient des champs pour State1, State2 et State3 qui retournent tous vers une table States. Je ne peux pas comprendre pour la vie de moi comment écrire une requête pour retourner un enregistrement avec tous les états énumérés. Si je n'avais besoin que d'un champ d'état, je sais que je ferais:Sélection SQL avec plusieurs références à table unique

SELECT Master.Name, State.Enumeration AS 'State' 
FROM MasterTable Master, StateTable State 
WHERE Master.State1 = State.ID; 

Comment puis-je développer ceci pour tous mes champs d'état?

Merci.

Répondre

11

retour une colonne de chacun des uniques joint aux états:

select m.Name, s1.Enumeration as State1, s2.Enumeration as State2, s3.Enumeration as State3 
from MasterTable m 
left join StateTable s1 on m.State1 = s1.ID 
left join StateTable s2 on m.State2 = s2.ID 
left join StateTable s3 on m.State3 = s3.ID 

retour 1 colonne de tous les états de la 3 rejoint:

select m.Name, ISNULL(s1.Enumeration + ',','') 
       + ISNULL(s2.Enumeration + ',','') 
       + ISNULL(s3.Enumeration,'') as Enumeration 
from MasterTable m 
left join StateTable s1 on m.State1 = s1.ID 
left join StateTable s2 on m.State2 = s2.ID 
left join StateTable s3 on m.State3 = s3.ID 

Il y a aussi colonne-requêtes. ..

select m.Name, 
ISNULL((select Enumeration from StateTable where ID = m.State1),'') as State1, 
ISNULL((select Enumeration from StateTable where ID = m.State2),'') as State2, 
ISNULL((select Enumeration from StateTable where ID = m.State3),'') as State3 
from MasterTable m 
+0

+1: Pour ajouter LEFT JOIN alternative –

+0

@ lumberjack4: Il n'y a pas de différence de performance entre la syntaxe ANSI-89 que vous avez posté, et ANSI-92 de Fosco. L'avantage de l'ANSI-92 est la syntaxe standardisée et largement supportée de OUTER JOIN (GAUCHE, DROITE au moins). –

+1

Merci à vous deux .. réalisé quand je suis en train d'éditer pour ajouter la deuxième requête. – Fosco

6

Vous devez utiliser des alias de table pour joindre plusieurs copies de même table:

SELECT m.Name, 
      s1.Enumeration AS 'State1', 
      s2.Enumeration AS 'State2' 
    FROM MasterTable m 
LEFT JOIN StateTable s1 = s1.id = m.state1 
LEFT JOIN StateTable s2 = s1.id = m.state2 

Une INNER JOIN nécessite que des données soient présentes - sinon, l'enregistrement entier est exclu. Un LEFT JOIN est plus sûr, comme si l'état1/2/3/etc permet NULLs ...

+0

J'espérais éviter une jointure explicite, mais il semble que ce soit comme ça. – lumberjack4

+0

@ Lumberjack4 pourquoi? – JNK

+0

Je comprends que ma requête originale fait une jointure dans les coulisses, je suppose que je ne suis pas assez à l'aise avec la base de données pour savoir quand utiliser quelle jointure. – lumberjack4

Questions connexes