2010-08-10 6 views
13

Mam SQL DB, który zawiera wiele tabel relacyjnych. Istnieje kilka pól w tabeli głównej, które odwołują się do innej tabeli wiele razy. Załóżmy na przykład, że mam bazę handlowców, którzy są odpowiedzialni za sprzedaż w wielu stanach. Moja baza danych zawiera pola dla State1, State2 i State3, z których wszystkie mapują z powrotem do tabeli stanów. Nie potrafię zrozumieć, jak napisać zapytanie, aby zwrócić rekord ze wszystkimi wyliczonymi stanami. Jeśli potrzebowałem tylko jednego pola State, wiem, że zrobiłbym:Wybór SQL z wieloma odniesieniami do pojedynczej tabeli

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

Jak mogę to rozszerzyć dla wszystkich pól państwowych?

Dzięki.

Odpowiedz

11

Zwracanie kolumnę z każdego unikalny dołącza do stanów:

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 

Wracając 1 Kolumna wszystkich państw z 3 przyłącza:

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 

Istnieje również kolumna zapytaniami. ..

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: W przypadku dodawania LEWEGO DOŁĄCZ alternatywy –

+0

@ lumberjack4: Nie ma żadnej różnicy w wydajności między publikowaną składnią ANSI-89, i ANSI-92 Fosco. Zaletą ANSI-92 jest standaryzowana i szeroko obsługiwana składnia OUTER JOIN (LEFT, RIGHT co najmniej). –

+1

Dziękuję wam .. uświadomiłem sobie, że podczas edycji dodałem drugie zapytanie. – Fosco

6

Musisz użyć aliasów w celu połączenia wielu kopii tego samego 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 

WEJŚCIE WEWNĘTRZNE wymaga obecności danych - jeśli nie, cały zapis jest wykluczony. LEWE DOŁĄCZ jest bezpieczniejsze, na przykład jeśli stan1/2/3/itd. Umożliwia NULL ...

+0

Miałem nadzieję uniknąć wyraźnego sprzężenia, ale wygląda na to, że tak musi być. – lumberjack4

+0

@ lumberjack4 dlaczego? – JNK

+0

Rozumiem, że moje pierwotne zapytanie wykonuje sprzężenie za kulisami, domyślam się, że po prostu nie jestem wystarczająco zadowolony z bazą danych, aby wiedzieć, kiedy użyć co dołączyć. – lumberjack4

Powiązane problemy