Wykorzystanie zawartosci jednej tabeli w drugiej

Odpowiedz Nowy wątek
2011-06-14 11:28
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, narazie 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

edytowany 2x, ostatnio: gawkes11, 2011-06-14 11:30

Pozostało 580 znaków

2011-06-14 12:02
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)

Pozostało 580 znaków

2011-06-14 13:09
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 :)

Pozostało 580 znaków

2011-06-14 14:18
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");
edytowany 6x, ostatnio: gawkes11, 2011-06-15 10:55
Pokaż pozostałe 2 komentarze
u mnie sie zrobił chyba unSensitive bo korzystam z Express Edition i próbowałem włączyć polskie znaki a skonczylo się w ten sposób : ) - gawkes11 2011-06-14 16:27
Oracle domyślnie nie jest case sensitive, chyba że przy definicji obiektu, czy nazwy pola, użyjesz podwójnych ciapków - wtedy musisz zawsze używać ciapków i takiego samego case. A tak przy okazji, to m1.skad i m2.dokad jest źle, bo w tabeli MIASTA nie ma takich pól. - scovron 2011-06-15 07:02
zmieniłem na SELECT l.*, m1.nazwa, m2.kod i dalej wyskakuje ten sam błąd - gawkes11 2011-06-15 10:32
Spróbuj l."Skad" zamiast l.Skad - scovron 2011-06-15 10:51
dokładnie o to chodziło :) - gawkes11 2011-06-15 10:54

Pozostało 580 znaków

2011-06-15 11:17
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

edytowany 2x, ostatnio: gawkes11, 2011-06-15 12:07

Pozostało 580 znaków

2011-06-15 11:17
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.

dobrze wiedzieć :) - gawkes11 2011-06-15 11:20

Pozostało 580 znaków

2011-06-15 12:39

Te dwa zapytania nie zwracają rekordów głównie dlatego, że nie mają szansy się wykonać. Pierwsze jest wogó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ć.

edytowany 1x, ostatnio: scovron, 2011-06-15 12:55

Pozostało 580 znaków

2011-06-15 13:35
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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