Wykorzystanie zawartosci jednej tabeli w drugiej

0

Witam mam taką tabelę:

ID_Lotu                                   NOT NULL NUMBER(38)
Nr_Seryjny                                         VARCHAR2(256)
Skad                                      NOT NULL VARCHAR2(256)
Dokad                                     NOT NULL VARCHAR2(256)
Cena                                      NOT NULL NUMBER(5,2)
Linie                                     NOT NULL VARCHAR2(256)
Data_Wylotu                               NOT NULL DATE
Data_Przylotu                             NOT NULL DATE

W polach Skad i Dokad znajdują się nazwy miast, na razie nie są one pobierane znikąd ale mam też tabelę miasta:

ID_Miasta                                 NOT NULL NUMBER(10)
Kod                                                VARCHAR2(256)
Nazwa                                     NOT NULL VARCHAR2(256)
Kraj                                      NOT NULL VARCHAR2(256) 

Jak zrobić, żeby wartosci w polach Skad i Dokad były pobierane z tabeli miasta ? Tj. jak musi wygladać relacja, dodam, ze bazę tworzę ręcznie.
Aha korzystam z Oracle'a jesli to ma jakeis znaczenie

1

Tabele pierwszą przerób tak:

ID_Lotu                                   NOT NULL NUMBER(38)
Nr_Seryjny                                         VARCHAR2(256)
Skad                                      NOT NULL NUMBER(10)
Dokad                                     NOT NULL NUMBER(10)
Cena                                      NOT NULL NUMBER(5,2)
Linie                                     NOT NULL VARCHAR2(256)
Data_Wylotu                               NOT NULL DATE
Data_Przylotu                             NOT NULL DATE

Teraz masz zrobione "po bożemu", tzn. nie trzymasz nazw miast, tylko ich identyfikatory - założyłem, że nie dopuszczasz możliwości wpisywania miasta ręcznie i wszystkie będą szły z tej drugiej tabeli.

W drugiej tabeli nie ruszaj struktury, tylko załóż klucz główny (chyba że już masz) - możesz po prostu dodać klauzulę PRIMARY KEY na koniec deklaracji pola ID_Miasta. Teraz możesz dodać klucze obce:

ALTER TABLE TABELA_Z_LOTAMI ADD CONSTRAINT fk1 FOREIGN KEY (Skad) REFERENCES TABELA_Z_MIASTAMI (ID_Miasta);
ALTER TABLE TABELA_Z_LOTAMI ADD CONSTRAINT fk2 FOREIGN KEY (Dokad) REFERENCES TABELA_Z_MIASTAMI (ID_Miasta);
gawkes11 napisał(a)

Jak zrobić, żeby wartosci w polach Skad i Dokad były pobierane z tabeli miasta ? Tj. jak musi wygladać relacja, dodam, ze bazę tworzę ręcznie.
Aha korzystam z Oracle'a jesli to ma jakeis znaczenie

Circa about tak:

select l.*, m1.Nazwa nazwa_skad, m2.Nazwa nazwa_dokad from TABELA_Z_LOTAMI l
left join TABELA_Z_MIASTAMI m1 on (m1.ID_Miasta = l.Skad)
left join TABELA_Z_MIASTAMI m2 on (m2.ID_Miasta = l.Dokad)
0

Dzięki za odpowiedź, zanim wypróbuję muszę trochę uzupełnić luki w wiedzy o Joinach, później zdam relację jak mi poszło :)

0

Tabela z miastami nazywa się Miasta, z lotami Polaczenie (wiem trochę niekonsekwentnie)

Wykonuję:

SQL> SELECT l.*, m1.skad, m2.dokad FROM Polaczenie l 
LEFT JOIN Miasta m1 ON (m1.ID_Miasta = l.Skad) 
LEFT JOIN Miasta m2 ON (m2.ID_Miasta = l.Dokad);

I dostaję taki error
*
ERROR at line 1:
ORA-00904: "L"."SKAD": invalid identifier

Co robię źle ?

create table MIASTA  (
   "ID_Miasta"          NUMBER(10)                      not null,
   "Kod"                VARCHAR2(256)                           ,
   "Nazwa"              VARCHAR2(256)                   not null,
   "Kraj"               VARCHAR2(256)                   not null,
   constraint PK_MIASTA primary key ("ID_Miasta")
);
create table POLACZENIE  (
   "ID_Lotu"            INTEGER                         not null,
   "Nr_Seryjny"         VARCHAR2(256),
   "Skad"               NUMBER(10)                   	not null,
   "Dokad"              NUMBER(10)                   	not null,
   "Cena"               NUMBER(5,2)                     not null,
   "Linie"              VARCHAR2(256)                   not null,
   "Data_Wylotu"        DATE                            not null,
   "Data_Przylotu"      DATE                            not null,
   constraint PK_POLACZENIE primary key ("ID_Lotu")
);

Przyznam się, że nie do końca kumam te złączenia mam ksiazke Oracle kompendium administratora ale tam jest srednio wytlumaczone zaraz poszukam gdzies w necie

///////////////////////////////////////
ufff w koncu sie udało, wygląda na to, że po stworzeniu bazy od nowa stała się nagle case sensitive ;)

SQL> SELECT l.*, m1."Nazwa", m2."Kod" FROM Polaczenie l 
LEFT JOIN Miasta m1 ON (m1."ID_Miasta" = l."Skad") 
LEFT JOIN Miasta m2 ON (m2."ID_Miasta" = l."Dokad");
 
0

Jak teraz powinno wyglądać moje zapytanie, które do tej pory wyglądało tak:

SELECT * from POLACZENIE where "Skad" = 'Warszawa' AND "Data_Wylotu" LIKE to_date('2011/6/15','yyyy/mm/dd') 

użytkownik wybiera sobie z comboboxa miasto(bez konkretnego lotniska, tj. kodu), ale przy wyswietlaniu danego polaczenia w jTable w kolumnie Skąd chce, żeby wyswietlane było miasto + jego kod np. Londyn (STN)

Czy to powinno wyglądać mniejwięcej tak:

SQL> SELECT l.*, m1."Nazwa", m1."Kod" FROM Polaczenie l 
LEFT JOIN Miasta m1 ON (m1."ID_Miasta" = l."Skad") 
LEFT JOIN Miasta m2 ON (m2."ID_Miasta" = l."Dokad") 
WHERE l."Skad"= select "ID_Miasta" where "Nazwa"='Warszawa';

próbuję jeszcze tak

SQL> SELECT l.*, m1."Nazwa", m1."Kod" FROM Polaczenie l 
LEFT JOIN Miasta m1 ON (m1."ID_Miasta" = l."Skad") 
LEFT JOIN Miasta m2 ON (m2."ID_Miasta" = l."Dokad") 
WHERE l."Skad" in
                      (select "ID_Miasta" from Polaczenie where "Nazwa"='Warszawa'); 

ale nie zwraca mi to żadnego rekordu

0
gawkes11 napisał(a)

ufff w koncu sie udało, wygląda na to, że po stworzeniu bazy od nowa stała się nagle case sensitive ;)

Nie "stała się", tylko Ty ją zrobiłeś case sensitive poprzez zdefiniowanie nazw pól w podwójnych cudzysłowach :)
I nie cała baza, tylko nazwy pól w tych tabelach.

0

Te dwa zapytania nie zwracają rekordów głównie dlatego, że nie mają szansy się wykonać. Pierwsze jest w ogóle niepoprawne składniowo - ten drugi select musiałby być w nawiasach. A w drugim zapytaniu chcesz wyświetlić pole "ID_Miasta" z Polaczenia, a tymczasem w tej tabeli nie ma takiego pola.
Spróbuj tak:

SELECT l.*, m1."Nazwa", m1."Kod" FROM Polaczenie l 
LEFT JOIN Miasta m1 ON (m1."ID_Miasta" = l."Skad") 
LEFT JOIN Miasta m2 ON (m2."ID_Miasta" = l."Dokad") 
WHERE m1."Nazwa" = 'Warszawa';

Jeżeli będziesz wyświetlać tylko miasto początkowe, to całego tego drugiego JOINa możesz wywalić.

0

Rzeczywiście zamieszałem się, trochę jestem zakręcony przy tym joinie ;)
Wielkie dzięki za cierpliwość !! : )

1 użytkowników online, w tym zalogowanych: 0, gości: 1