2016-09-27 48 views
0

此查询创建一个市政总结报告,包括落在道路缓冲区内的所有受体计数,并按城市分组。书写清洁整理PostgreSQL/PostGIS查询

所以基本上输出将

munname school childcare hospitals etc... 
"mun1"   3   4  0 
"mun2"   1   0   9 


select b.mun,b.county,q1.schools,q2.childcares,q3.hospitals,q4.nursinghomes,q5.infrastructure,q6.streamwmi,q7.streammi,q8.rez,b.geometry into roadreport 
     from (select muntruck.munname as mun,muntruck.muncounty as county,mun.geom as geometry from muntruck,mun 
      where muntruck.munname = mun.mun and muntruck.muncounty = mun.county) as b 
      left join(select count(schools.gid) as schools,muntruck.munname as mun,muntruck.muncounty as county from muntruck,schools 
       where st_intersects(muntruck.igeom,schools.geom) group by muntruck.muncounty,muntruck.munname) as q1 
        on b.mun = q1.mun and b.county = q1.county 
      left join(select count(childcare.gid) as childcares,muntruck.munname as mun,muntruck.muncounty as county from muntruck,childcare 
       where st_intersects(muntruck.igeom,childcare.geom) group by muntruck.muncounty,muntruck.munname) as q2 
        on b.mun = q2.mun and b.county = q2.county 
      left join(select count(hospitals.gid) as hospitals, muntruck.munname as mun,muntruck.muncounty as county from muntruck,hospitals 
       where st_intersects(muntruck.igeom,hospitals.geom) group by muntruck.muncounty,muntruck.munname) as q3 
        on b.mun = q3.mun and b.county = q3.county 
      left join(select count(nursinghomes.gid) as nursinghomes, muntruck.munname as mun,muntruck.muncounty as county from muntruck,nursinghomes 
       where st_intersects(muntruck.igeom,nursinghomes.geom) group by muntruck.muncounty,muntruck.munname) as q4 
        on b.mun = q4.mun and b.county = q4.county 
      left join(select count(infra.gid) as infrastructure,muntruck.munname as mun,muntruck.muncounty as county from muntruck,infra 
       where st_intersects(muntruck.igeom,infra.ggeom) group by muntruck.muncounty,muntruck.munname) as q5 
        on b.mun = q5.mun and b.county = q5.county 
      left join(select sum(st_length(geom))/5280 as streamwmi, muntruck.munname as mun,muntruck.muncounty as county from muntruck, streamsw 
       where st_intersects(muntruck.igeom,streamsw.geom) group by muntruck.muncounty,muntruck.munname) as q6 
        on b.mun = q6.mun and b.county = q6.county 
      left join(select sum(st_length(geom))/5280 as streammi, muntruck.munname as mun,muntruck.muncounty as county from muntruck,streams 
       where st_intersects(muntruck.igeom,streams.geom) group by muntruck.muncounty,muntruck.munname) as q7 
        on b.mun = q7.mun and b.county = q7.county 
      left join(select sum(popest*((ST_Area(residentialpopulation.geom)/43560)/acresnew)) as rez, muntruck.munname as mun,muntruck.muncounty as county from muntruck,residentialpopulation 
       where st_intersects(muntruck.igeom,residentialpopulation.geom) group by muntruck.muncounty,muntruck.munname) as q8 
        on b.mun = q8.mun and b.county = q8.county; 

它运行完全正常,并创建与每个城市的正确计数的文件。我只是想知道这里是否有多余的代码?它可以更清洁,不那么凌乱?任何建议将不胜感激

+0

此查询是ORM的输出吗? (当不是:寻求帮助) – wildplasser

+0

我不确定ORM是什么?它是一个GIS形状文件.. – ziggy

回答

0

正如我理解你的查询,在每个子查询中,你计数市镇与其他表(学校,医院等)加入记录。我想你可以做所有的连接一次,如:

SELECT 
    muntruck.munname AS mun, 
    muntruck.muncounty AS county, 
    mun.geom as geometry, 
    COUNT(schools.gid) AS schools, 
    COUNT(childcare.gid) AS childcares, 
    COUNT(hospitals.gid) AS hospitals 
FROM muntruck 
JOIN mun ON (muntruck.munname = mun.mun AND muntruck.muncounty = mun.county) 
LEFT JOIN schools ON ST_Intersects(muntruck.igeom, schools.geom) 
LEFT JOIN childcare ON ST_Intersects(muntruck.igeom, childcare.geom) 
LEFT JOIN hospitals ON ST_Intersects(muntruck.igeom, hospitals.geom) 
GROUP BY 
    muntruck.muncounty, 
    muntruck.munname, 
    mun.geom 

它看起来更清洁和可以理解的,我认为它会产生相同的结果。

+0

是更清洁,更具可读性 – ziggy

+0

仅供参考在左连接后,您将额外的括号放在st_intersects上,但您的结构正常工作 – ziggy

+0

@ziggy,感谢您发现此问题,修正了parenthisis。 – icuken