gpt4 book ai didi

PostgreSQL "Missing From-Clause Error"

转载 作者:行者123 更新时间:2023-11-29 11:57:25 25 4
gpt4 key购买 nike

我有两个版本的 PostgreSQL (8.0.4/8.1.4),我注意到在 8.1.4 中,我收到以下语句的“缺少从子句错误”:

DELETE FROM MDFUSERGROUPREL_DELETED 
WHERE userid = MDFUSERGROUPREL.userid
AND usergroupid = MDFUSERGROUPREL.usergroupid
AND userid=?

因为在 8.0.4 中不能使用 SELECT 语句执行 DELETE,所以我改用直接表引用,但这似乎在 8.1.4 中引起了问题

是否有人能够确认此行为并在可能的情况下提供解决方法?

我知道我使用的版本很旧且不受支持,这是环境限制,所以不,我不能只升级它。

最佳答案

您依赖于旧版本 PostgreSQL 的行为,该行为过去常常在引用未在 FROM 中列出的表时隐式添加 FROM 子句。您将能够在查询的 EXPLAIN 中看到这一点。

此错误功能已从 PostgreSQL 中移除。它导致了打字错误的意外交叉产品,通常是一个非常糟糕的主意。您可以通过设置 add_missing_from 重新启用它作为临时解决方法在问题查询之前或在 postgresql.conf 中使用 SET 语句将配置参数设置为 true。此向后兼容性变通办法已在 9.0 中删除,因此您无法使用它来让您的应用程序在 9.0 或更高版本上运行。我特意链接到文档的 8.4 版本,因为该参数已从更高版本中删除。

参见 this mailing list discussion .

此查询中出现问题的原因是您正在对 MDFUSERGROUPREL 进行隐式连接。您应该在 DELETE 语句的 USING 子句中明确命名此表。

这是一个显示问题和解决方法的演示:http://sqlfiddle.com/#!11/6c4b3/4 ...这里有一个演示,展示了如何以两种不同的方式正确地做到这一点:http://sqlfiddle.com/#!11/6c4b3/7 .第一个是一个简单的修复,它只是将缺少的 from 子句添加到查询中并修复产生的列名冲突:

DELETE FROM MDFUSERGROUPREL_DELETED
USING MDFUSERGROUPREL
WHERE MDFUSERGROUPREL_DELETED.userid = MDFUSERGROUPREL.userid
AND MDFUSERGROUPREL_DELETED.usergroupid = MDFUSERGROUPREL.usergroupid
AND MDFUSERGROUPREL_DELETED.userid=1;

您会发现后两个示例至少在现代版本的 PostgreSQL 上产生相同的查询计划,因此无论您使用 EXISTS 还是连接都没有区别。

我遵循了您查询的原始风格,未使用表别名,但我强烈建议您使用别名以提高可读性。请参阅@wildplasser 的示例。

关于PostgreSQL "Missing From-Clause Error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15657300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com