如何将两个关联Parceles表的统计SELECT查询合并为单一查询
合并两个统计查询为单一结果集的解决方案
要把这两个独立的统计查询合并成包含REFCAT、INFORMACIO、CEDULES三列的结果集,有两种直观且高效的方法,我给你详细说明:
方法一:使用LEFT JOIN关联子查询
这种方法的思路是先分别完成两个统计(作为子查询),再以parceles表的REFCAT为基准,把两个统计结果关联起来。用LEFT JOIN可以保证即使某个REFCAT在其中一个表没有对应数据,也能保留该REFCAT并显示0值。
SELECT p.REFCAT, COALESCE(i_count.Informacio, 0) AS INFORMACIO, COALESCE(c_count.CEDULES, 0) AS CEDULES FROM parceles p LEFT JOIN ( SELECT i.fid_parceles, COUNT(i.Ref_cadastral) AS Informacio FROM informacio i GROUP BY i.fid_parceles ) i_count ON p.fid = i_count.fid_parceles LEFT JOIN ( SELECT c.fid_parceles, COUNT(c.Ref_cadastral) AS CEDULES FROM cedules c GROUP BY c.fid_parceles ) c_count ON p.fid = c_count.fid_parceles ORDER BY INFORMACIO DESC, CEDULES DESC;
说明:
- 两个子查询分别统计每个
fid_parceles对应的行数,避免重复关联parceles表,提升效率 COALESCE函数用来把NULL值(即没有对应数据的情况)替换为0,结果更规整- 最后可以根据需求调整排序规则
方法二:使用UNION ALL合并后聚合
如果你的数据量较大,这种方法可能更高效——先把两个表的关联数据合并,再一次性统计数量:
SELECT p.REFCAT, SUM(CASE WHEN source = 'informacio' THEN 1 ELSE 0 END) AS INFORMACIO, SUM(CASE WHEN source = 'cedules' THEN 1 ELSE 0 END) AS CEDULES FROM parceles p LEFT JOIN ( SELECT fid_parceles, 'informacio' AS source FROM informacio UNION ALL SELECT fid_parceles, 'cedules' AS source FROM cedules ) combined ON p.fid = combined.fid_parceles GROUP BY p.REFCAT ORDER BY INFORMACIO DESC, CEDULES DESC;
说明:
UNION ALL把informacio和cedules的fid_parceles数据合并,同时标记来源表- 外层用
SUM(CASE...)分别统计来自两个表的行数 - 这种方式只需要关联
parceles表一次,在数据量较大时性能更优
两种方法都能得到你需要的REFCAT | INFORMACIO | CEDULES格式结果,你可以根据自己的数据库环境和数据规模选择合适的方案。
内容的提问来源于stack exchange,提问作者kestrelol
相关产品推荐
相关产品推荐

