Postaram się jak najlepiej wyjaśnić problem i przedstawić przykłady.
Mam dwie tabele (Tabela A i Tabela B), z których każdama do dyspozycji trzy klucze. Chcę wykonać połączenie i chcę wykonać połączenie na wielu poziomach. Rozumiem przez to, że jeśli klucz 1 pasuje między dwiema tabelami, to dołącz do tego. Dla pozostałych, które nie pasują, użyj Klucza 2, aby dołączyć, a dla pozostałych, że nadal nie pasuje, użyj klawisza 3, aby dołączyć. Liczy się hierarchiczna kolejność połączeń.
Przykładowe dane:
-----------------------------------------------
| ------ TABLE A ------ | ------ TABLE B ------ |
| KEY 1 | KEY 2 | KEY 3 | KEY 1 | KEY 2 | KEY 3 |
|-------|-------|-------|-------|-------|-------|
ROW 1 | ABC | AAA | BBB | ABC | PPP | QRS |
ROW 2 | DEF | RRR | NNN | XYZ | RRR | NMO |
ROW 3 | HIJ | TTT | NNN | GHI | MMM | QQQ |
ROW 4 | TUV | VVV | LLL | OPQ | UUU | LLL |
ROW 5 | LMN | III | EEE | XYZ | III | JJJ |
ROW 6 | PQR | CCC | OOO | WXY | HHH | DDD |
-----------------------------------------------
Więc jeśli rozpocznę dołączanie do Klucza 1, tylko Wiersz 1 będzie pasował i skończę z tym krokiem. Następnie przechodzę do klucza 2, gdzie wiersze 2 i 5 pasują do siebie. Wreszcie przechodzę do klucza 3 i tylko wiersz 4 będzie pasował.
Chcę więc, aby moje końcowe dane z tabeli A i tabeli B wyglądały następująco:
-----------------------------------------------
| ------ TABLE A ------ | ------ TABLE B ------ |
| KEY 1 | KEY 2 | KEY 3 | KEY 1 | KEY 2 | KEY 3 |
|-------|-------|-------|-------|-------|-------|
ROW 1 | ABC | AAA | BBB | ABC | PPP | QRS | (Key 1)
ROW 2 | DEF | RRR | NNN | XYZ | RRR | NMO | (Key 2)
ROW 5 | LMN | III | EEE | XYZ | III | JJJ | (Key 2)
ROW 4 | TUV | VVV | LLL | OPQ | UUU | LLL | (Key 3)
-----------------------------------------------
Nie mogę wymyślić, jak umieścić warunki w SQL NA instrukcja dla złączenia lub jeśli muszę wykonać jakieś zagnieżdżone sprzężenia.
Dziękuję bardzo za Twoją pomoc!
PS: Tabele przykładowe wyglądają, jakby były posortowane w tej samej kolejności, ale to tylko dla ułatwienia zrozumienia.
Odpowiedzi:
0 dla odpowiedzi № 1UNION klawisz JOIN ON 1 równy, klawisz JOIN ON 1 nie jest równy AND klucz 2 równy, a klawisz JOIN ON 1 nie jest równy AND klucz 2 nie jest równy AND klucz 3 jest równy.
0 dla odpowiedzi nr 2
Coś takiego zwróci określony wynik:
SELECT a1.key1 AS a_key1
, a1.key2 AS a_key2
, a1.key3 AS a_key3
, b1.key1 AS b_key1
, b1.key2 AS b_key2
, b1.key3 AS b_key3
, "(key 1)" AS `match`
FROM tablea a1
JOIN tableb b1
ON b1.key1 = a1.key1
UNION ALL
SELECT a2.key1
, a2.key2
, a2.key3
, b2.key1
, b2.key2
, b2.key3
, "(key 2)" AS match
FROM tablea a2
JOIN tableb b2
ON b2.key1 <> a2.key1
AND b1.key2 = a2.key2
UNION ALL
SELECT a3.key1
, a3.key2
, a3.key3
, b3.key1
, b3.key2
, b3.key3
, "(key 3)" AS match
FROM tablea a3
JOIN tableb b3
ON b3.key1 <> a3.key1
AND b3.key2 <> a3.key2
AND b3.key3 = a3.key3