2016-05-05 8 views
1

У меня есть две таблицы TB1 и TB2 с MANT-ко-многим:
Postgresql: LEFT JOIN не работает

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 

В результате я хочу get is:

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 

Так что я сделал это запрос на выборку с левой присоединиться, как это:

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) 

, но я получаю этот результат:

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

Что я упускаю?

ответ

1

Поскольку вы хотите сохранить все возможные комбинации значений id от tb1 и tb2, одним из вариантов будет CROSS JOIN этих таблиц. Затем, LEFT JOIN этот результат на таблицу моста tb2_has_tb1, чтобы сохранить все отношения.

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

Что делает COALESCE? – SlimenTN

+0

'COALESCE (t.money, 0.0)' будет использовать значение 't.money', если оно _not_ null, и оно вернет' 0.0', когда оно равно null. Вот как вы можете обнаружить, что соединение не произошло. –

Смежные вопросы