2017-01-09 30 views
0

我當前的查詢顯示名爲「Buque」的表中的數據,並且具有來自其他表的一些引用。問題是,當我執行查詢時,它從不顯示結果,因爲它消耗了太多的內存我猜。Postgresql - 如果存在數據,則進行條件加入

當前查詢我有

select buq.buq_codigo, tbu.tbu_codigo, tbu.tbu_nombre, pai.pai_codigo, pai.pai_nombre, 
pue.pto_codigo, pue.pto_nombre, lin.lin_codigo, lin.lin_nombre, tra.tra_codigo, 
tra.tra_nombre, buq.buq_nombre, buq.buq_des, buq.num_trb, buq.num_eslora, 
buq.max_tons, buq.reg_lloyd, buq.buq_codigo1, buq.codigo_omi, 
case buq.buq_estado when 'A' then 'Activo' else 'Inactivo' end as buq_estado 

from publico.mae_buque as buq, publico.mae_tipbuque as tbu, publico.mae_pais as pai, 
publico.mae_puerto as pue, publico.mae_linea as lin, publico.mae_trafico as tra 

where buq.tbu_codigo = tbu.tbu_codigo or 
buq.pai_codigo = pai.pai_codigo or 
buq.pto_codigo = pue.pto_codigo or 
buq.lin_codigo = lin.lin_codigo or 
buq.tra_codigo = tra.tra_codigo 

我也試圖與內部連接,但問題是,它返回我滿足的加入條件的數據。換句話說,如果連接有數據進行比較,則返回名稱,否則顯示空數據。

查詢必須返回我611條記錄,內部連接返回68條記錄。

回答

0

你必須使用左外連接:

select * 
    from 
    publico.mae_buque as buq 
    left outer join publico.mae_tipbuque as tbu on (buq.tbu_codigo = tbu.tbu_codigo) 
    left outer join publico.mae_pais as pai on (buq.pai_codigo = pai.pai_codigo) 
    left outer join publico.mae_puerto as pue on (buq.pto_codigo = pue.pto_codigo) 
    left outer join publico.mae_linea as lin on (buq.lin_codigo = lin.lin_codigo) 
    left outer join publico.mae_trafico as tra on (buq.tra_codigo = tra.tra_codigo); 
+0

完善這個可以得到非常大,我剛纔看到的圖像與加入解釋。謝謝! – Jorge

1

關於你期望的結果,使用左外連接,填補了任何不存在與空值的右手邊表的行;

關於內存不足問題,請注意您使用了or來連接您的表;這實際上導致這樣一個事實,幾乎每個涉及表的記錄都與幾乎所有其他記錄相關(幾乎是交叉連接/笛卡爾產品);如果連接6臺...

select buq.buq_codigo, tbu.tbu_codigo, tbu.tbu_nombre, pai.pai_codigo, pai.pai_nombre, 
pue.pto_codigo, pue.pto_nombre, lin.lin_codigo, lin.lin_nombre, tra.tra_codigo, 
tra.tra_nombre, buq.buq_nombre, buq.buq_des, buq.num_trb, buq.num_eslora, 
buq.max_tons, buq.reg_lloyd, buq.buq_codigo1, buq.codigo_omi, 
case buq.buq_estado when 'A' then 'Activo' else 'Inactivo' end as buq_estado 

from publico.mae_buque as buq 
    left outer join publico.mae_tipbuque as tbu on buq.tbu_codigo = tbu.tbu_codigo 
    left outer join publico.mae_pais as pai on (buq.pai_codigo = pai.pai_codigo) 
    left outer join publico.mae_puerto as pue on (buq.pto_codigo = pue.pto_codigo) 
    left outer join publico.mae_linea as lin on (buq.lin_codigo = lin.lin_codigo) 
    left outer join publico.mae_trafico as tra on (buq.tra_codigo = tra.tra_codigo) 
+0

這將返回我存在的數據,但也有我的主要表「Buque」上的空值,我想向他們顯示所有 – Jorge

+0

是'publico.mae_buque'主表,或有另一個,例如, 'publico.buque'? –

+0

這是主表,所有有「mae_」的都是主表。這些是標識符和描述的參考。 – Jorge

相關問題