Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres查询中的“表的FROM子句项引用无效”_Sql_Postgresql_Correlated Subquery_Jsonb_Lateral - Fatal编程技术网

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 ...