SQL查询ON子句中表列无法识别异常问题求助
问题分析与解决方案
这个问题我太熟悉了——你踩了PostgreSQL双引号标识符解析的经典坑!
核心原因
PostgreSQL对带双引号的标识符(表名、列名)有严格的解析规则:
- 双引号内的内容会被当作完整的单个标识符,里面的点号
.不会被解析成「表名.列名」的分隔符 - 同时,双引号会强制区分大小写,必须和你创建对象时的大小写完全匹配
你写的"Segments.Id"会被PostgreSQL误认为是Segments表中名为Segments.Id的列(而不是Segments表的Id列),这就是为什么报错提示该列不存在。同理,"AggregatedValues.Segment"也会被当成一个完整的列名,而非AggregatedValues表的Segment列,调换条件顺序后自然会报另一个列不存在的错误。
正确的SQL写法
把表名和列名分别用双引号包裹,点号放在双引号之外,让PostgreSQL正确识别表和列的关系:
SELECT "Segments"."Id", "AggregatedValues"."Segment" FROM "Segments" INNER JOIN "AggregatedValues" ON "Segments"."Id" = "AggregatedValues"."Segment";
额外小提示
如果你的表和列创建时没有用双引号,PostgreSQL会自动将它们转换为小写存储,这时候你甚至可以不用双引号,直接写小写的标识符也能正常查询:
SELECT segments.id, aggregatedvalues.segment FROM segments INNER JOIN aggregatedvalues ON segments.id = aggregatedvalues.segment;
内容的提问来源于stack exchange,提问作者Sergi Doce
相关产品推荐
相关产品推荐

