错误:“.”处或附近的语法错误第 4 行:在 like.takerId = frame.likeId 上;

问题描述

我有一个名字是 like 的表。但是每当我必须从中选择数据时,我都会收到此错误,我想通了 public.like ..但是当我尝试连接两个表时

SELECT *
FROM frame
INNER JOIN public.like
ON like.takerId = frame.likeId;

我收到这个错误

ERROR:  Syntax error at or near "."
LINE 4: ON like.takerId = frame.likeId;

我也使用公共前缀,但它抛出

ERROR:  column like.takerid does not exist
LINE 4: ON public.like.takerId = frame.likeId;
           ^
HINT:  Perhaps you meant to reference the column "like.takerId".

即使它说 column like.takerid does not exist ,那为什么它给我 HINT: Perhaps you meant to reference the column "like.takerId". 我不知道,我认为 like 表名有问题,like一个 sql语法,它假定 likesql 语法并抛出错误。我应该更改我的表名吗?或者有什么方法可以使 sql 区分大小写,或者我如何告诉 sql 忽略 likepublic.like 不适用于加入表。

解决方法

由于 like 是保留关键字,因此每次出现时都需要使用 double quotes(除非它以您发现的架构名称为前缀)

SELECT *
FROM frame
  JOIN public.like ON "like".takerId = frame.likeId;

SELECT *
FROM frame
  JOIN "like" ON "like".takerId = frame.likeId;

或者使用别名

SELECT *
FROM frame f
  JOIN "like" l ON l.takerId = f.likeId;

但从长远来看,您应该为不需要引用的表找到一个不同的名称。

,

您绝对应该为您的桌子选择另一个名称。 LIKE 是保留命令,使用它被认为是一种不好的做法,尽管可以使用 ",例如

CREATE TABLE public."like" (id int);
INSERT INTO public."like" VALUES (42);
SELECT * FROM "public.like"

EDIT:正如@a​​_horse_with_no_name 所指出的,在临时表中指定架构将不起作用(检查 db<>fiddle),因此只有表名应该在双引号之间作为更正在上面的片段中。对于临时表,只需省略架构:

CREATE TEMPORARY TABLE "like" (id int);
INSERT INTO "like" VALUES (42);
SELECT * FROM "like"

演示:db<>fiddle

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...