Sql Postgres查询中的“表的FROM子句项引用无效”
我有以下疑问:Sql Postgres查询中的“表的FROM子句项引用无效”,sql,postgresql,correlated-subquery,jsonb,lateral,Sql,Postgresql,Correlated Subquery,Jsonb,Lateral,我有以下疑问: query = "SELECT data #>> '{id}' AS id, data #>> '{name}' AS name, data #>> '{curator}' AS curator, data #> '{$isValid}' AS \"$isValid\", data #> '{customer}'
query =
"SELECT
data #>> '{id}' AS id,
data #>> '{name}' AS name,
data #>> '{curator}' AS curator,
data #> '{$isValid}' AS \"$isValid\",
data #> '{customer}' AS customer,
data #> '{$createdTS}' AS \"$createdTS\",
data #> '{$updatedTS}' AS \"$updatedTS\",
data #> '{$isComplete}' AS \"$isComplete\",
(count(keys))::numeric as \"numProducts\",
created_at
FROM
appointment_intakes,
LATERAL jsonb_object_keys(data #> '{products}') keys
INNER JOIN
appointment_intake_users
ON
appointment_intake_users.appointment_intake_id = appointment_intakes.id
#{where_clause}
GROUP BY id"
并导致以下错误:
对表的FROM子句条目的引用无效
在我添加以下内容后,错误开始发生:
LATERAL jsonb_object_keys(data #> '{products}') keys
及
因为我需要计算产品的数量
如何避免发生此错误?错误解释
错误消息的直接原因是任何显式连接绑定的强度都大于逗号,而逗号在其他方面等同于交叉连接,但是:
注:当超过两个时,后一种等价性并不完全成立
表出现,因为JOIN绑定比逗号更紧密。例如
从T1交叉连接T2内部连接T3 ON条件与
从T1开始,T2内部连接T3 ON条件,因为该条件可以
第一种情况下参考T1,但第二种情况下不参考T1
我的。
这就是你犯错误的原因。您可以修复它:
原始查询
基于上述和其他一些假设,解决方案可能是在子查询中进行计数:
选择i.data->>“id”作为id,
i、 数据->>“名称”作为名称,
i、 数据->>“策展人”作为策展人,
i、 数据->“$isValid”为$isValid,
i、 数据->作为客户的“客户”,
i、 数据->“$createdTS”作为$createdTS,
i、 数据->“$updatedTS”作为$updatedTS,
i、 数据->“$isComplete”作为$isComplete,
选择计数*::数值
从jsonb_object_keysi.data->“产品”作为numProducts,
创建的分钟数与创建的分钟数相同
从预约到入学i
加入约会\u接收\u用户u ON u.appointment\u接收\u id=i.id
-{where_子句}
按i.id分组;
因为您只需要计数,所以我将您的横向联接转换为相关子查询,从而避免了由多个1:n联接组合而产生的各种问题。更多:
您需要正确地转义标识符,使用准备好的语句并将值作为值传递。不要将值连接到查询字符串中。这是对随机错误或SQL注入攻击的邀请。PHP的最新示例:
谢谢你,欧文。尽管我可能没有提供所有必要的信息,但你却能为我提供一个很好的解决方案,并在这个过程中教会我一两件事。@moment:Cool。我添加了更多的链接和对主要错误的解释。关于你问题中的信息:这样做的目的是让其他人也能理解这个问题。不是每个人都有这样的经验和运气去猜测它。从您的查询中不清楚您的非限定列名(如data或id)确切指的是哪个表。请使用表格别名并澄清。在回答中考虑我的存根。还要声明您的Postgres版本和用于连接查询的编程语言。看起来像是SQL注入攻击的邀请。。。当然,还有表定义-您在psql中使用\d tbl可以得到什么。我们需要看到PK和notnull等约束。
(count(keys))::numeric as \"numProducts\"
FROM appointment_intakes
CROSS JOIN LATERAL jsonb_object_keys(data #> '{products}') keys
INNER JOIN appointment_intake_users ON ...