/ / Multi-Level / IF-instrukcja JOIN w SQL? Czy to możliwe? - mysql, sql, sql-server, join

Multi-Level / IF-JOIN instrukcji w SQL? Czy to możliwe? - mysql, sql, sql-server, dołącz

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 № 1

UNION 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