Foreign Key - Wyświetlanie

0

Witam,
Uczę się języka SQL i mam nurtujące pytanie. Najlepiej wytłumaczę je na przykładzie: Stwórzmy 2 relację (PostgreSQL):

CREATE TABLE utwory
(
  id serial PRIMARY KEY NOT NULL,
  jezyki_id integer NOT NULL,
  CONSTRAINT stanowiska_fk FOREIGN KEY (jezyki_id)
  REFERENCES jezyki (id)
)

oraz

CREATE TABLE jezyki
(
  id serial PRIMARY KEY NOT NULL,
  nazwa character varying(50),
)

Tabelę języki wypełniam dwoma językami 1- polski 2-angielski.

INSERT INTO JEZYKI (NAZWA) VALUES ('POLSKI');
INSERT INTO JEZYKI (NAZWA) VALUES ('ANGIELSKI')

W tabeli utwory tworzę cztery utwory.

INSERT INTO UTWORY (JEZYKI_ID) VALUES (1);
INSERT INTO UTWORY (JEZYKI_ID) VALUES (2);
INSERT INTO UTWORY (JEZYKI_ID) VALUES (2);
INSERT INTO UTWORY (JEZYKI_ID) VALUES (1)

Teraz jeżeli użyję:

SELECT * FROM UTWORY

To dostanę coś w stylu 1-1 1-2 3-2 4-1
Natomiast jeżeli użyję kodu:

SELECT UTWORY.ID,JEZYKI.NAZWA FROM UTWORY INNER JOIN JEZYKI ON UTWORY.JEZYKI_ID = JEZYKI.ID

To uzyskam pożądany efekt. Tylko czy to zawsze musi działać na takiej zasadzie - używania JOIN? Pytam bo brak mi doświadczenia w tym temacie, może jest jakiś szybszy mechanizm?

1

Nie ma (tzn zawsze można zrobić podzapytanie, ale efektywnie wyjdzie na to samo a join jest bardziej elegancki) i jest to rozwiązanie jak najbardziej poprawne. Zresztą nie będzie wcale specjalnie "wolne" bo masz automatycznie index primary na kluczu więc takie złączenie będzie wykonane bardzo wydajnie.

0

ja tak trochę OT - nie wstawiaj stringów do pola numerycznego bo silnik musi wykonać niejawną konwersję jednego na drugie

0

Powyższe zapytania są do d... NIE MAJĄ PRAWA się wykonać... Wstawiasz do tabeli UTWORY wartości do pola id, które jest SERIAL PRIMARY KEY NOT NULL. Abstrahując już od tego, że wstawiasz stringi, to wstawiasz wartości powtarzające się! No i wstwiasz do SERIAL... bez sensu.

0

Nie zwracałem zbytnio uwagi na jakość tego co piszę bo zależało mi na przedstawieniu problemu. Masz rację, zamiast 3,4 wpisałem '1' i '2' na dodatek jako stringi. Pisałem to wszystko w poście - na szybko, nie sprawdzając czy w ogóle działa. Następnym razem wpiszę wszystko tak jak należy ;) Edit: Zapytania poprawiłem.

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