PSQL JOIN报错:column不存在问题及关联UPDATE语句有效性咨询
嘿,这个问题我之前也碰到过,本质是PostgreSQL对标识符引用规则的严格要求导致的,咱们一步步拆解:
为什么SELECT查询报错?
你写的查询里用了"AOP.col2"这种写法——在PostgreSQL中,双引号是用来包裹单个标识符(比如表名、列名、表别名)的,如果你把AOP.col2整个用双引号括起来,数据库会把它当成一个完整的列名(即一个名为AOP.col2的列),而不是AOP表下的col2列。哪怕你的table2里确实有col2列,数据库也找不到名为AOP.col2的列,所以才会报ERROR: column "AOP.col2" does not exist。
正确的SELECT验证查询写法
如果你的表名、列名、别名都没有特殊字符(比如大写、空格、特殊符号),完全不需要加引号,直接写:
SELECT * FROM "table1" AS ARR INNER JOIN "table2" AS AOP ON AOP.col2 = ARR.col1;
如果你的标识符有特殊字符(比如表名是Table1带大写,或者列名是col-2带横杠),需要给单个标识符分别加引号:
SELECT * FROM "Table1" AS ARR INNER JOIN "Table2" AS AOP ON "AOP"."col2" = "ARR"."col1";
(不过一般别名都是简单的缩写,没必要给别名加引号,直接写AOP.col2就好)
你的UPDATE语句会失败吗?
答案是肯定的!因为你在UPDATE里犯了同样的错误:"ARR.col1"、"AOP.col3"、"ARR.col4"都是把别名.列名当成了一个完整的列名,数据库同样会找不到这些列,最终报错。
正确的UPDATE语句写法
同样遵循“双引号只包裹单个标识符”的规则,正确写法如下:
UPDATE "table2" AS AOP SET col2 = ARR.col1 FROM "table1" AS ARR WHERE AOP.col3 = ARR.col4;
如果列名有特殊字符,比如col2是大写的Col2,就给列名单独加引号:
UPDATE "table2" AS AOP SET "Col2" = ARR."Col1" FROM "table1" AS ARR WHERE AOP."Col3" = ARR."Col4";
核心总结
PostgreSQL中,双引号的作用是区分大小写或包含特殊字符的标识符,但只能包裹单个标识符。不要把表别名.列名整个用双引号括起来,否则数据库会把它识别成一个奇怪的列名,自然找不到啦。
内容的提问来源于stack exchange,提问作者Leon

