PostgreSQL中无公共关联字段的两张表如何实现跨表数据计算
PostgreSQL 无关联表统计值比率计算实现方案
你需要的两个统计值都是单行单列的标量结果,不需要两表存在关联字段,直接通过子查询取值计算即可,有两种常用写法:
写法1:直接嵌套标量子查询
最简洁的写法,直接把两个统计逻辑作为子查询放到SELECT子句中计算:
SELECT -- 转换为numeric避免整数除法截断小数 (SELECT count(class) FROM table2)::numeric / (SELECT count(*) FROM table1) AS ratio;
写法2:交叉连接单行结果集
逻辑更直观,先分别统计两个表的结果,再通过交叉连接拼接成单行数据后计算:
SELECT t2.class_cnt::numeric / t1.total AS ratio FROM (SELECT count(*) AS total FROM table1) t1 CROSS JOIN (SELECT count(class) AS class_cnt FROM table2) t2;
注意事项
- 两种写法执行效果完全一致,可根据个人编码习惯选择
- 必须对其中一个计数结果做
::numeric类型转换:PostgreSQL中两个整数类型做除法会默认截断小数部分,比如3/10会返回0而非0.3,转换为数值类型后才能得到精确的比率结果 - 由于两个子查询都仅返回1行1列的结果,交叉连接不会产生笛卡尔积问题,不会出现数据膨胀
内容的提问来源于stack exchange,提问作者Katty_one
相关产品推荐
相关产品推荐

