【发布时间】:2016-06-14 10:11:47
【问题描述】:
我在 PostgreSQL 数据库中有 3 个表:
localities (loc, 12561 rows)
plants (pl, 17052 rows)
specimens or samples (esp, 9211 rows)
pl 和 esp 都有一个字段 loc,用于指定标记的植物生活在哪里,或者该样本(通常是带有叶子和花朵的树枝)来自哪里。
我需要一份关于有植物或样本的地方的报告,以及每个地方的植物和样本的数量。到目前为止我做的最好的是两个子查询的联合,它运行得非常快(33 毫秒来获取 69 行):
(select l.id,l.nome,count(pl.id) pls,null esps
from loc l
left join pl on pl.loc = l.id
where l.id in
(select distinct pl.loc
from pl
where pl.loc > 0)
group by l.id,l.nome
union
select l.id,l.nome,null pls,count(e.id) esps
from loc l
left join esp e on e.loc = l.id
where l.id in
(select distinct e.loc
from esp e
where e.loc > 0)
group by l.id,l.nome)
order by id
重点是,当同一个地方既有植物又有样品,就变成了两条截然不同的线,比如:
11950 | San Martin | | 5 |
11950 | San Martin | 61 | |
当然我想要的是:
11950 | San Martin | 61 | 5 |
在此之前,我尝试过在一个查询中完成所有操作:
select l.id,l.nome,count(pl.id),count(e.id) esps
from loc l
left join pl on pl.loc = l.id
left join esp e on e.loc = l.id
where l.id in
(select distinct pl.loc
from pl
where pl.loc > 0)
or l.id in
(select distinct e.loc
from esp e
where e.loc > 0)
group by l.id,l.nome
但它会返回一个奇怪的重复(它将两个结果相乘并显示两次):
11950 | San Martin | 305 | 305 |
我尝试过不使用子查询,但花了大约 13 秒,这太长了。
【问题讨论】:
标签: postgresql join subquery union