优化了联盟中的查询

时间:2014-11-28 13:15:37

标签: sql postgresql postgresql-9.3

这里用样本解释我的问题。

表名ledg,bill,vocu

 Ledg

    id
    name

bill
   id
   amt

vouc

   id
   amt

这里我想在bill和vouc中选择amt大于零的名称。但是bill和vouc没有相同的id。我想表明哪个amt大于零。

所以我试过这个

select *  
from ledg g inner join vouc v on v.id=g.id 

union all

select *  
from ledg g inner join bill b on b.id=g.id

它的工作正常。我可以在单个查询或任何有效查询中获得相同的结果吗?

样品

insert into ledg(id,name) values(1,'aa'),
(2,'bb'),
(3,'cc');


insert into bill(id,amt) values(1,10),(2,-10);

insert into vouc(id,amt) values(3,30);

输出

NAME  Amt

aa    10
cc    30

1 个答案:

答案 0 :(得分:1)

如果您想要其他两个表中值大于ledg的{​​{1}}行,您可以执行以下操作:

0

这可以很好地利用select g.* from ledg g where exists (select 1 from vouc v where v.id = l.id and v.amt > 0) and exists (select 1 from bill b where b.id = l.id and b.amt > 0); idvouc列的索引。