2017-12-08 7 views
0

Ich bin ganz neu in SQL und ich versuche, zwei Tabellen zu verknüpfen,Joining 2 Tische mit begrenzten Verbindungsbedingungen

Tabelle A:

ID Amount Bank 
123 50  Barclays 
123 50  tesco 
123 50  HSBC 
123 100  LLyods 
123 200  MBNA 

Tabelle B:

ID Amount Bank 
123 50  aa 
123 50  bb 
123 50  cc 
123 100  dd 
123 200  ee 

Beachten Sie: In Tabelle B ist der Bankname der gleiche wie Tabelle A, aber es ist in einem anderen Format geschrieben, so dass ich nicht auf t beitreten kann seine.

das Skript bei mir läuft ist:

Select A.*, B.* 
FROM TableA A 
Left Join TableB B 
on A.ID = B.ID AND A.AMOUNT = B.AMOUNT 
; 

Das Ergebnis i erhalten,

ID Amount Bank ID AMOUNT BANK 
123 50 Barclays 123 50  aa 
123 50 Barclays 123 50  bb 
123 50 Barclays 123 50  cc 
123 50 tesco  123 50  aa 
123 50 tesco  123 50  bb 
123 50 tesco  123 50  cc 
123 50 HSBC  123 50  aa 
123 50 HSBC  123 50  bb 
123 50 HSBC  123 50  cc 
123 100 LLyods  123 100  dd 
123 200 MBNA  123 200  ee 

, was ich will, ist zu bekommen,

ID Amount Bank ID AMOUNT BANK 
123 50 Barclays 123 50  aa 
123 50 tesco  123 50  bb 
123 50 HSBC  123 50  cc 
123 100 LLyods  123 100  dd 
123 200 MBNA  123 200  ee 

ich das Problem ist, dass es jede Zeile der Tabelle A mit den Zeilen der Tabelle B verbindet, die die Join-Bedingungen erfüllen; Leider hat die Tabelle B keine anderen eindeutigen Werte, die ich als Join-Bedingung verwenden kann.

Kann die Gemeinde bitte sehen, wenn Sie an etwas denken können, würde ich es sehr schätzen. Danke :)

+0

teradata oder SQL Server? – GurV

+0

Sie erstellen eine Viele-zu-Viele-Beziehung mit diesem Join. Gibt es eine Möglichkeit, die Bankspalte in Tabelle A mit der Bankspalte in Tabelle B in Beziehung zu setzen. Erstellen Sie möglicherweise eine Spalte in Tabelle A, die diese Symbole in Tabelle B enthält? –

+0

Teradata; @hollow_Victory Dies ist ein kleines Beispielbeispiel; Die Bankspalte hat 200 verschiedene Werte und ich kann sie nicht mit dem –

Antwort

0

können Sie innere verwenden beitreten für Ihre gewünschte Ergebnis

Select A.* 
B.* 
FROM TableA A 
INNER JOIN TableB B 
    on A.ID = B.ID 
    AND A.AMOUNT = B.AMOUNT 
; 
+0

Das schafft immer noch eine Kreuzverbindung von der vielen zu vielen Beziehung. –

+0

Inner Join gibt mir das gleiche Ergebnis –

+0

@ - Samar Vijay: Inner Join gibt Ihnen, was er will? –

2

Ist es möglich, dass Sie eine dritte Tabelle zu erstellen, die Tabelle ein Bankwerte an ihre entsprechenden Tabelle B-Bank Werten entsprechen? Weil ohne irgendeine Art von Verknüpfungstabelle, die die Beziehung spezifiziert, der SQL-Server keine Möglichkeit hat, zu wissen, dass "Barclays" = "aa", "tesco" = "bb" usw. Es muss irgendeine Art von einzigartiger Beziehung geben, und Sie habe das nicht in den zwei Tabellen zur Verfügung gestellt.

Linktable:

Code Bank 
aa  Barclays 
bb tesco 
cc HSBC 
dd LLyods 
e MBNA 

Anschließend können Sie tun:

Select A.*, B.* 
FROM TableA A 
    JOIN LinkTable LB ON (A.Bank = LB.Bank) 
    JOIN TableB B ON (LB.ID = B.Bank); 
+0

Seien Sie hier vorsichtig. Denken Sie über den Beitritt nach. Wenn Sie also Tabelle A mit LinkTable verbinden, wird eine Anzahl von Eins zu Eins erstellt, aber nach dem Hinzufügen von Tabelle B wird ein "Viele zu Viele" erstellt. Die Joins würden sequenziell sein. –

0

direkt an den Ausgang die Sie wollen, können Sie dies tun:

SELECT * 
FROM TableA a 
LEFT JOIN TableB b ON on A.ID = B.ID AND A.AMOUNT = B.AMOUNT 
AND 
(
    (a.Bank = 'Barclays' AND b.bank = 'aa') OR 
    (a.Bank = 'tesco' AND b.bank = 'bb') OR 
    (a.Bank = 'HSBC' AND b.bank = 'cc') OR 
    (a.Bank = 'Lloyds' AND b.bank = 'dd') OR 
    (a.Bank = 'MBNA' AND b.bank = 'ee') 
) 

Aber das ist hässlich und keine gute Lösung, wenn Sie Hunderte von Abbildungen haben. Es geht auch davon aus, dass (Bank, ID, Betrag) Ihr PK für beide Tabellen ist. Der beste Weg besteht darin, eine Link/Mapping-Tabelle zu erstellen, wie sie MorbidGnome oben vorgeschlagen hat, und diese in Ihre Joins einzufügen.

Wenn Sie ziehen keine Daten von TableB (wie in Ihrem Beispiel), dann können Sie nur eine CASE-Anweisung verwenden, anstatt zu TableB des Zugriffs:

SELECT a.*, 
    CASE a.Bank 
    WHEN 'Barclays' THEN 'aa' 
    WHEN 'tesco' THEN 'bb' 
    WHEN 'HSBC' THEN 'cc' 
    WHEN 'Lloyds' THEN 'dd' 
    WHEN 'MBNA' THEN 'ee' 
    END AS Bank_B 
FROM TableA