2010-08-10 10 views
13

Ho un DB SQL che contiene più tabelle relazionali. Ci sono alcuni campi nella tabella principale che fanno riferimento a un'altra tabella più volte. Ad esempio, supponiamo di avere un database di venditori responsabili delle vendite per più stati. Il mio database contiene campi per Stato1, Stato2 e Stato3 che riportano tutti a una tabella Stati. Non riesco a capire per la vita di me come scrivere una query per restituire un record con tutti gli stati enumerati. Se ho solo bisogno di un campo di stato, so che farei:Selezione SQL con più riferimenti a tabella singola

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

Come posso espandere questo per tutti i miei campi di stato?

Grazie.

risposta

11

Tornando una colonna da ciascuna delle unico unisce agli stati:

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 

Tornando 1 colonna di tutti gli stati del 3 unisce:

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 

C'è anche colonne-query. ..

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: per l'aggiunta di SINISTRA alternativa –

+0

@ lumberjack4: Non c'è differenza di prestazioni tra la sintassi ANSI-89 che hai postato, e Fosco ANSI-92. Il vantaggio di ANSI-92 è la sintassi OUTER JOIN (LEFT, RIGHT almeno) ampiamente supportata e ampiamente supportata. –

+1

Grazie a entrambi .. l'ho capito quando stavo modificando per aggiungere la seconda query. – Fosco

6

È necessario utilizzare alias di tabella per unire più copie dello stesso tabella:

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 

Un JOIN INNER richiede che siano presenti dati - in caso contrario, l'intero record è escluso. UN SINISTRO SINISTRO è più sicuro, come se lo stato 1/2/3/etc consenta NULL ...

+0

Speravo di evitare un join esplicito, ma sembra che sia così che deve essere. – lumberjack4

+0

@ lumberjack4 perché? – JNK

+0

Capisco che la mia query originale faccia un join dietro le quinte, immagino di non essere abbastanza a mio agio con il databasing per sapere quando usare quel join. – lumberjack4

Problemi correlati