Czy konieczne będzie utworzenie oddzielnych tabel np. tab_KrajeDostawców i tab_KrajeKlientów?
Nie.
Jak wyciągnąć kwerendą takie dane: nr transakcji, kraj dostawcy i kraj kupującego?
Masz kilka metod
1. przez złączenie pełne z klauzulą WHERE
Kod: Zaznacz cały
select
id_transakcji as "numer transakcji",
k1.NazwaKraju as "kraj dostawcy",
k2.NazwaKraju as "kraj kupującego"
from
transakcje as "t",
dostawcy as "d",
kraje as "k1",
klienci as "k",
kraje as "k2"
where
t.idDostawcy = d.IDDostawcy
and d.idKrajLubRegion = k1.IDKraj
and t.idKlienta = j.IDKlienta
and k.idKrajLubRegion = k2.IDKraj
Warto używać, jeśli baza na kompilator zapytań z dobrym optymalizatorem.
2. przez złączenie wewnętrzne z klauzulą ON
Kod: Zaznacz cały
select
id_transakcji as "numer transakcji",
k1.NazwaKraju as "kraj dostawcy",
k2.NazwaKraju as "kraj kupującego"
from
transakcje as "t"
join dostawcy as "d" on t.idDostawcy = d.IDDostawcy
join kraje as "k1" on d.idKrajLubRegion = k1.IDKraj
join klienci as "k" on t.idKlienta = j.IDKlienta
join kraje as "k2" on k.idKrajLubRegion = k2.IDKraj
Jest to postać bliska optymalnej, warto używać w bazach słabo optymalizujących zapytania.
3. przez złączenie wewnętrzne z klauzulą USING -- tylko wtedy, kiedy JOIN odbywa się przez dopasowanie jednakowo nazwanych atrybutów
Kod: Zaznacz cały
select
id_transakcji as "numer transakcji",
k1.NazwaKraju as "kraj dostawcy",
k2.NazwaKraju as "kraj kupującego"
from
transakcje as "t"
join dostawcy as "d" using(IDDostawcy)
join kraje as "k1" on using(IDKraj)
join klienci as "k" on using(IDKlienta)
join kraje as "k2" on using(IDKraj)
Podobnie jak poprzednia; u Ciebie się nie da, bo klucze własne i obce noszą odmienne nazwy.
4. przez podzapytania skorelowane
Kod: Zaznacz cały
select
id_transakcji as "numer transakcji",
(select NazwaKraju from kraje where IDKraj=(select idKrajLubRegion from dostawcy as where idDostawcy = IDDostawcy)) as "kraj dostawcy",
(select NazwaKraju from kraje where IDKraj=(select idKrajLubRegion from klienci as where idKlienta = IDKlienta)) as "kraj kupującego"
from transakcje
Jest to najgorsza metoda, raczej nie godna polecenia.
Pisałem kod bez sprawdzania. Mogą być literówki różnego rodzaju.