如何解决SQL字段列表列存在歧义的报错?附代码求排查
问题背景
对product_sales、product两张表做关联操作时,执行SQL触发ProductNumber字段歧义报错,原始代码如下:
INSERT INTO HSD_DW.PRODUCT_SALES SELECT UNIX_TIMESTAMP(TimeID) AS TimeID, CustomerID, ProductNumber, SUM(Quantity) AS TotalQty, UnitPrice, SUM(Quantity) * UnitPrice AS Total FROM HSD.PRODUCT_SALES AS PS INNER JOIN hsd.product AS P ON PS.ProductNumber = P.ProductNumber GROUP BY TimeID, CustomerID, ProductNumber, UnitPrice ORDER BY TimeID;
错误原因
- 歧义报错核心原因:
ProductNumber是两张关联表的同名字段,在SELECT、GROUP BY子句中直接书写字段名、未加表别名限定时,数据库无法识别需要读取哪张表的该字段,直接抛出歧义错误。 - 潜在风险:当前SQL里的
TimeID、CustomerID、Quantity、UnitPrice如果也是两张表共有的字段,不加别名限定后续同样会触发同类报错。
修正方案
所有跨表可能重名的字段,都加上对应表的别名前缀做明确限定,修正后可正常执行的代码如下:
INSERT INTO HSD_DW.PRODUCT_SALES SELECT UNIX_TIMESTAMP(PS.TimeID) AS TimeID, PS.CustomerID, PS.ProductNumber, SUM(PS.Quantity) AS TotalQty, PS.UnitPrice, SUM(PS.Quantity) * PS.UnitPrice AS Total FROM HSD.PRODUCT_SALES AS PS INNER JOIN hsd.product AS P ON PS.ProductNumber = P.ProductNumber GROUP BY PS.TimeID, PS.CustomerID, PS.ProductNumber, PS.UnitPrice ORDER BY PS.TimeID;
说明:因为关联条件已经限定
PS.ProductNumber = P.ProductNumber,两表该字段值完全一致,此处取销售表PS的字段即可;如果业务上需要取商品表P的对应字段,把对应字段前缀换成P.效果相同。
内容的提问来源于stack exchange,提问作者Apryle Fedeles
相关产品推荐
相关产品推荐

