2016-05-05 10 views
1

Ich habe zwei Tabellen TB1 und TB2 mit mant-to-many-Beziehung:
Postgresql: LEFT JOIN funktioniert nicht

tb1: 
id | code 
------------- 
1 | 6% 
2 | 12% 

tb2: 
id | code 
------------- 
1 | code_001 
2 | code_002 

tb2_has_tb1: 
id_tb2 | id_tb1 | money 
--------------------------- 
1  | 1  | 250.0 
1  | 2  | 300.0 
2  | 1  | 100.0 

Das Ergebnis ich will erhalten ist:

code_tb2 |code_tb1 | money 
------------------------------ 
code_001 |6%  | 250.0 
code_001 |12%  | 300.0 
code_002 |6%  | 100.0 
code_002 |12%  | 0.0 //----I want to display this row with zero if there is no join 
So 10

was ich getan habe ist eine Auswahlabfrage mit links wie folgt verbinden:

SELECT tb2.code as code_tb2, tb1.code as code_tb1, money 
FROM tb1 LEFT JOIN tb2_has_tb1 ON (tb1.id = id_tb1) 
LEFT JOIN tb2 ON (tb2.id = id_tb2) 

aber ich erhalte dieses Ergebnis:

code_tb2 |code_tb1 | money 
------------------------------ 
code_001 |6%  | 250.0 
code_001 |12%  | 300.0 
code_002 |6%  | 100.0 

Was bin ich?

Antwort

1

Da Sie alle möglichen Kombinationen von ID-Werten von tb1 und tb2 behalten möchten, wäre eine Option CROSS JOIN diese Tabellen. Dann, LEFT JOIN dieses Ergebnis an die Bridge-Tabelle tb2_has_tb1, um jede Beziehung zu behalten.

SELECT tb2.code AS code_tb2, tb1.code AS code_tb1, 
    COALESCE(t.money, 0.0) AS money 
FROM tb1 CROSS JOIN tb2 
LEFT JOIN tb2_has_tb1 t 
    ON tb1.id = t.id_tb1 AND tb2.id = t.id_tb2 
+0

Was COALESCE tun? – SlimenTN

+0

'COALESCE (t.money, 0.0)' verwendet den Wert 't.money', wenn es _not_ null ist, und es gibt' 0.0' zurück, wenn es null ist. So können Sie erkennen, dass der Join nicht stattgefunden hat. –