簡體   English   中英

PostgreSQL-如果數據存在則有條件聯接

[英]Postgresql - Conditional Join if data exist

我當前的查詢顯示名為“ Buque”的表中的數據,並具有來自其他表的一些引用。 問題是,當我執行查詢時,它永遠不會顯示結果,因為我猜想它消耗了太多內存。

我有當前查詢

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條記錄。

關於所需的結果,請使用左外部聯接,該聯接使用空值填充右側表中所有不存在的行;

關於內存不足的問題,請注意您曾經使用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)

您必須使用左外部聯接:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM