2017-01-09 27 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

相关问题