Cześć ,
Mam do was pytanie czy w SQL możliwe jest łączenie tabeli X z tabelą Y , w momencie kiedy tabela X nie ma klucza obcego tabeli Y ?
Cześć ,
Mam do was pytanie czy w SQL możliwe jest łączenie tabeli X z tabelą Y , w momencie kiedy tabela X nie ma klucza obcego tabeli Y ?
Schemat Mojej bazy:
TabelaKierowca:
KierowcaID
Imie
Nazwisko
PanstwoID
Tabela Panstwo:
PanstwoID
NazwaPanstwa
Ludnosc
SamochodID
Tabela Samochod:
SamochodID
Marka
RokProdukcji
chcę wyświetlic Imie i nazwisk kierowcy ktory ma samochod marki Audi.Tabelki Panstwo i Samochod mam połączone inner join :
Select NazwaPanswa,Ludnosc,Marka
from Panstwo as p
inner join Samochod as s on p.SamochodID=s.SamochodID
Czyli kierowca z samochodem jest związany z dokładnością do "nijak"?
_13th_Dragon napisał(a):
Czyli kierowca z samochodem jest związany z dokładnością do "nijak"?
To jest tylko przykład.
Kierowca i samochód w tym przykładzie nie są powiązani kluczem obcym , chcę wyświetlić dane z poziomu tabeli kierowca . Gdybym chciał to zrobić z poziomu tabeli Panstwo , zrobił bym to* join inner * i po problemie .
Nie jestem jakiś mega dobry z sql ale takie coś może zadziała?
select k.Imie, k.Nazwisko
from Kierowca k, Panstwo p, Samochod s
where k.PanstwoID = p.PanstwoID
and p.SamochodID = s.SamochodID
and s.Marka = 'Audi'
Zapytanie jest OK - widocznie nie masz wspólnych ID w tabelach (zakładam że ID w obu tablicach to jakiś INT - a nie na przykład char i problem białych znaków).
Możesz to prosto zobaczyć przerabiając zapytanie na:
Select NazwaPanswa,Ludnosc,Marka, p.SamochodID SamochodIDpanstwo, s.SamochodID samochodID
from Panstwo as p
FULL OUTER JOIN Samochod as s on p.SamochodID=s.SamochodID
Panowie aby zobrazować mój problem w sposób bardziej rzeczywisty pokaże wam to na innym przykładzie , przyjmujemy że każda tabela jest wypełniona danymi:
**Tabela Kierowca: **
Tabela Państwo
** Tabela Pasażer**
Tabela Samochód
I chcę z tabeli kierowca wyświetlić imię,nazwisko kierowcy ,a także nazwę państwa z którego on pochodzi oraz imię i nazwisko pasażera z którym jedzie. Tabelki Państwo i Pasażer połączę z kierowcą inner join w ten sposób:
Select k.Imię,k.Nazwisko,p.NazwaPanstwa,pas.ImiePasazera,pas.Nazwiskopasażera
from Kierowca as k
inner join Państwo as p on k.PanstwoID=p.PanstwoID
inner join Pasazer as pas on k.PasazerID=pa.Pasazer ID
Mój problem polega na tym że nie wiem jak się dostać do marki samochodu aby z tabeli Kierowca wyświetlić tą wartość.
Zrób dwa joiny, weź tabelę "kierowcy" potem dołącz do niej Państwa (p.id = k.panstwo_id), potem dołącz samochody (p.samochod_id = s.samochod_id) a na końcu daj where i warunek wg którego chcesz wybrać kierowców.
Po prostu dodaj kolejny join i tyle ?
SELECT k.Imię, k.Nazwisko,
p.NazwaPanstwa,
pas.ImiePasazera,pas.Nazwiskopasażera,
s.Marka
FROM Kierowca as k
INNER JOIN Państwo as p
ON k.PanstwoID = p.PanstwoID
INNER JOIN Pasazer as pas
ON k.PasazerID = pa.Pasazer ID
LEFT JOIN Samochód as s
ON s.samochodID = p.SamochodID
Dzięki wszystkim za odpowiedz , left join załatwił sprawę , ale pojawił się drugi problem a mianowicie po prawidłowym wykonaniu tego selecta pojawiły się wiersze które są duplikatami . Mianowicie Imię kierowcy wyskakuje 3x takie samo, nazwisko kierowcy 3x takie samo,NazwaPanstwa 3x taka sama,inne zaś są dane pasażera. Chcę zaznaczyć ze ten problem pojawia się tylko gdy ozywam do tego tabelki Marka , bez tej tabelki te zapytanie wykonuje sie w sposób prawidłowo.
Z tego ci widziałem to chesz mieć kierowców, którzy mają auto marki "audi". Musisz właściwie zapisać warunek w where, który z tego miksu rekordów przefiltruje ci je i da ostateczny wynik czyli do tego wszystkie dopisać where s.marka == audi, ewentualnie jeśli będzie więcej rekordów to albo groupby albo distinct.