Firebird数据库GROUP BY语句查询SKU对应尺码区间报错咨询
问题原因
- Firebird 不支持在 GROUP BY 子句中直接引用 SELECT 列表中定义的列别名,你写的
GROUP BY SHORTSKU, SIZEFROM, SIZETO里的三个别名都无法被识别 - 两个获取尺码名称的子查询属于关联计算列,Firebird 不支持将这类动态计算的关联子查询结果直接放到 GROUP BY 中做分组依据
- 原 SQL 中冗余关联了 TALLESPORARTICULOS 表(别名TA)但未使用,反而会导致数据重复放大,增加不必要的计算开销
- 额外注意:你原SQL中引用的
codigoparticular字段和你提供的表结构中的LongSKU字段名不一致,以下代码已修正为实际字段名LongSKU
解决方法
思路:用两次 JOIN 直接关联 TALLESPORARTICULOS 表分别获取起始、结束尺码名称,GROUP BY 直接使用原始计算逻辑和关联字段,避免使用别名和关联子查询。
CREATE OR ALTER VIEW RANGOSPARACOSTOSYPRECIOS( SHORTSKU, SIZEFROM, SIZETO, PRICE ) AS select substring(ar.LongSKU from 1 for 10) AS SHORTSKU, ts_from.Sizes as SIZEFROM, ts_to.Sizes as SIZETO, max(RT.PRICE) as PRICE from Articulos Ar Inner Join rangostalle RT On AR.productId = RT.productId -- 关联获取起始尺码名称 left join TALLESPORARTICULOS ts_from on ts_from.ProductId = Ar.ProductId and ts_from.Position = RT.FromPosition -- 关联获取结束尺码名称 left join TALLESPORARTICULOS ts_to on ts_to.ProductId = Ar.ProductId and ts_to.Position = RT.ToPosition GROUP BY substring(ar.LongSKU from 1 for 10), -- 直接写计算逻辑,不用别名 ts_from.Sizes, ts_to.Sizes;
结果验证
执行视图查询SELECT * FROM RANGOSPARACOSTOSYPRECIOS即可得到你预期的结果,针对你提供的测试数据,注意TALLESPORARTICULOS插入语句存在笔误:ProductId=1的XXTRALARGE尺码Position字段值误写为1,应改为5,调整测试数据后即可完全匹配预期输出。
内容的提问来源于stack exchange,提问作者Nir Strahman
相关产品推荐
相关产品推荐

