Strona 1 z 1

Klucz główny jako klucz obcy w dwóch tabelach

: wt lut 03, 2015 2:38 pm
autor: forami
Witam wszystkich. Mam 4 tabele:

- dostawcy
- klienci
- kraje
- transakcje


Każdy dostawca może być z jednego z krajów z tabeli kraje. Również kupujący może być z jednego z krajów z tab. kraje.

W tabeli "transakcje" zapisuję co to za towar, który dostawca i który kupujący.

Jak wyciągnąć kwerendą takie dane: nr transakcji, kraj dostawcy i kraj kupującego?

Czy konieczne będzie utworzenie oddzielnych tabel np. tab_KrajeDostawców i tab_KrajeKlientów?

W załączeniu baza danych.

Re: Klucz główny jako klucz obcy w dwóch tabelach

: śr lut 04, 2015 1:44 am
autor: Jan_J
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.

Re: Klucz główny jako klucz obcy w dwóch tabelach

: sob lut 07, 2015 12:30 am
autor: forami
A czy poprzez interface Base'a da się to wykonać? (Pewnie nie..)

Re: Klucz główny jako klucz obcy w dwóch tabelach

: sob lut 07, 2015 12:59 am
autor: Jan_J
Raczej tak. Base będzie wymagać pełnych kwalifikacji nazw, postaci "Tabela"."Atrybut"