我有一个依赖于创建两个中间表的选择过程。我需要帮助重写代码以使用子查询而不是中间表。
我真的不了解子查询,我尝试过的每一个都会返回错误。
此代码提供了我想要的结果,但依赖于创建中间表:
Select modded_vgi_ptsutm.pplx,ST_Distance(modded_vgi_ptsutm.geom,split_polygons.geom) as dist into intermediate from modded_vgi_ptsutm,split_polygons where split_polygons.objectid = 87 order by dist as limit 10;
Select pplx,count(pplx) as count,avg(dist) as dist into intermediate2 from intermediate group by pplx order by dist asc;
Select pplx,dist from intermediate2 where count > 1;
注意:我将此发布到此处而不是gis页面,因为我认为我的特定问题是比gis更多的sql
答案 0 :(得分:1)
您应该能够使用子查询来组合这些:
Select pplx, avg(dist) as dist
into intermediate2
from (Select modded_vgi_ptsutm.pplx, ST_Distance(modded_vgi_ptsutm.geom, split_polygons.geom) as dist
from modded_vgi_ptsutm cross join
split_polygons
where split_polygons.objectid = 87
order by dist
limit 10
) t
group by pplx
having count(pplx) > 1
order by dist;
注意:在from
子句中使用逗号是可疑的,因为它会产生笛卡尔积。我用明确的cross join
替换了它。
答案 1 :(得分:0)
这应该可以解决问题:
SELECT pplx,dist FROM
(
SELECT pplx,count(pplx) AS count,avg(dist) AS dist FROM
(
SELECT modded_vgi_ptsutm.pplx,ST_Distance(modded_vgi_ptsutm.geom,split_polygons.geom) AS dist FROM
modded_vgi_ptsutm,split_polygons where split_polygons.objectid = 87 ORDER BY dist AS LIMIT 10
)
GROUP BY pplx ORDER BY dist asc
)
WHERE count > 1;