为什么Postgres允许我让列不在Group By中?

mar*_*991 0 sql postgresql

为什么这个查询:

SELECT inv.batch_number_id AS batch_number_id,
   inv.expiry_date AS expiry_date,
   inv.facility_id AS facility_id,
   inv.id AS id,
   fac.code AS facility_code,
   inv_st.description AS status,
   bn.batch_nbr AS batch_number,
   bn.expiry_date AS batch_expiry_date,
   sum(CASE WHEN al.status_id < 90 THEN al.alloc_qty ELSE 0 END) AS alloc_qty
FROM inventory inv
INNER JOIN facility fac ON inv.facility_id = fac.id
INNER JOIN inventory_status inv_st ON inv.status_id = inv_st.id
LEFT OUTER JOIN batch_number bn ON inv.batch_number_id = bn.id
LEFT OUTER JOIN allocation al ON al.from_inventory_id = inv.id
GROUP BY inv.id,
     facility_code,
     status,
     batch_number,
     batch_expiry_date
Run Code Online (Sandbox Code Playgroud)

在postgres 9.1.6工作?

从文档:"当存在GROUP BY时,SELECT列表表达式无法引用除聚合函数之外的未分组列,因为对于未分组的列,将返回多个可能的值."

如果我添加fac.id到select表达式,我得到预期的"错误:列"fac.id"必须出现在GROUP BY子句中或用于聚合函数".为什么postgres抱怨该列而忽略了facility_id?(原始查询中还有一大堆其他列也以同样的方式违反了我的期望.为了清晰起见,缩短了示例.)

poz*_*ozs 5

整个报价是:

当GROUP BY存在时,SELECT列表表达式无法引用未聚合的列,但在聚合函数中或者未分组的列在功能上依赖于分组列,因为否则将返回多个可能的值.一个未分组的专栏.如果分组列(或其子集)是包含未分组列的表的主键,则存在功能依赖性.

更新:此功能在9.1中添加