Złączanie tabel więcej niż jednym kluczem

0

Może głupie pytanie, ale co daje złączenie tabel więcej niż jednym kluczem? Tzn np zapis:

SELECT * FROM Tabela1 T1 INNER JOIN Tabela2 T2 on T1.ID=T2.ID AND T1.ID1=T2.ID2

Czy ma to jakiś sens, czy wystarczyłoby napisać

SELECT * FROM Tabela1 T1 INNER JOIN Tabela2 T2 on T1.ID=T2.ID

i otrzymalibyśmy to samo?

0

To zależy co masz w tych tabelach, ale ogólnie wygląda to na jakiś WTF i nieznormalizowaną bazę.

0

Mam np takie tabel:

BANK

IDBanku(klucz główny) | IDOddziału(klucz obcy)

Konto Bankowe

IDKonta(klucz główny) | IDBanku(klucz obcy) | IDOddziału(klucz obcy)

Oddział

IDOddziału(klucz główny) | IDBanku(klucz obcy)

I teraz chciałbym dokonać złączenia tych tabeli w celu policzenia tam czegoś. I teraz czy muszę pisać coś takiego:

SELECT *
FROM
BANK AS B INNER JOIN ODDZIAL AS O ON B.IDBANKU = O.IDBANKU
INNER JOIN KONTO BANKOWE AS KB ON KB.IDODDZIALU = O.IDODDZIALU
AND
O.IDBANKU = KB.IDBANKU

Czy wystarczy:

SELECT *
FROM
BANK AS B INNER JOIN ODDZIAL AS O ON B.IDBANKU = O.IDBANKU
INNER JOIN KONTO BANKOWE AS KB ON KB.IDODDZIALU = O.IDODDZIALU

Jeżeli w takim przypadku trzeba łączyć dwoma kluczami, to czy jest ktoś w stanie mi wytłumaczyć dlaczego?

0

Ale przecież te tabele są źle zrobione o_O Tu nie ma co tłumaczyć. Trzeba zaorać i zrobić poprawnie.
Jakim cudem IDBanku jest kluczem głównym skoro mozesz mieć bank z 2 oddziałami? I co wtedy? Masz dwa razy w tej jednej tabeli to samo IDBanku? No to to nie może być klucz główny bo ten musi być unikalny!
Dodatkowo masz redundancje danych bo skoro w tabeli Bank masz już powiązanie Banku i Oddziału to w tabeli z Oddziałami mieć go nie powinieneś, bo tworzy to anomalie przy modyfikacji (konieczność wykonania wielu modyfikacji jednocześnie). To samo tyczy się konta bankowego...

0

No dobrze, ale to nie ja robiłem tę bazę. To jest fragment bazy z kolokwium, na którym dostajemy model konceptualny, a potem robimy z niego fizyczny i piszemy zapytania. Także tutaj nie należy patrzeć na redundancję danych(przynajmniej tak mi się wydaje). Moje pytanie dotyczy raczej tego co się stanie gdy połączymy tabele dwoma kluczami, a co się stanie gdy tego nie zrobimy w takim przypadku.

0

No dobrze, ale to nie ja robiłem tę bazę. To jest fragment bazy z kolokwium

Nie wierzę. Ja jednak myśle że tam są klucze złożone a ty po prostu tego nie rozumiesz...

Jak łączysz po kluczu złożonym to musisz robić wiele warunków joina bo inaczej przecież masz niejednoznaczne dopasowanie! Jeśli złączysz coś tylko za pomocą IDBanku to wtedy zamiast n dopasowań zrobi się n2 bo wszystkie pasujące wiersze zostaną połączone.

0

Przerysowane z wyżej (i gdzie tutaj jest klucz złożony? poszczególne kolumny są oznaczone jako PK, FK ale powiązanie jest po prostu "nieprzemyślane"):
BANK

IDBanku(klucz główny) | IDOddziału(klucz obcy)
Konto Bankowe

IDKonta(klucz główny) | IDBanku(klucz obcy) | IDOddziału(klucz obcy)
Oddział

IDOddziału(klucz główny) | IDBanku(klucz obcy)
A prawidłowa baza powinna wyglądać tak, i nie widzę zastosowania klucza złożonego:
BANK

IDBanku(klucz główny)
Konto Bankowe

IDKonta(klucz główny) | IDOddziału(klucz obcy)
Oddział

IDOddziału(klucz główny) | IDBanku(klucz obcy)
Ale jeśli nie możesz ingerować w bazę to tak jak napisał Shalom musisz podać oba warunki, inaczej w przypadku wielu oddziałów w jednym banku będziesz miał zwrócone wiele zdublowanych rekordów z informacją o danym koncie.

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