postgresql - SELECT 中包含多个表的不明确列引用“ctid”
问题描述
我CRecordset
用来查询一个表,但我使用第二个表来过滤数据。如果在我的GetDefaultSQL
覆盖方法中我返回一个包含多个表的表列表,那么我会收到此错误:列引用“ctid”不明确。我知道什么是“ctid”列,但我没有在我的代码中使用它。它由 ODBC 驱动程序插入到原始 SQL 语句中。如何解决这个问题?如何告诉 ODBC 驱动程序不要插入“ctid”列?
我尝试CRecordset::Open
使用readOnly
参数调用,因为我假设 ODBC 需要ctid
更新行,而我不需要更新它们。但错误仍然存在。
还尝试向缺少它的第二个表添加主键,认为如果表有主键,那么 ODBC 可以使用它而不是“ctid”,但同样没有运气。不过是有道理的,因为我没有获取第二个表的任何列,而第二个表仅用于过滤。
如果我创建一个数据库视图来解决这个问题,我会得到错误:列“ctid”不存在。
解决方案
您必须CRecordset::Open
更改两个参数来调用:
m_pSet->Open(CRecordset::snapshot, NULL, CRecordset::readOnly);
然后,您可以毫无错误地获取连接的表和视图。那么没有“ctid”。
推荐阅读
- java - 使用 OAuth2 的 Google 授权
- php - 如何创建自定义小部件区域并将内容存储在页脚中?
- docker - 如果我的应用程序 (.NET Core) 在 docker 容器中运行,我该如何应用 SSL?
- c++ - 用 C++ 中的所有元素复制对象!(构造函数和赋值,最佳实践?)
- asp.net-web-api - 为什么 urlHelper.Link 方法返回 null 或导致异常?
- sql-server - 将查询结果存储到 SQL Server 中的变量
- elixir - scrivener_html 使用 elixir 中的查询参数进行分页
- javascript - 如何仅对没有 parentId 的项目和具有 parentId 的项目保留第一项的项目按 id 分组?
- android - 需要根据屏幕设置 PopupWindow 位置
- java - Firebase 实时数据库:有没有办法从不同的节点获取价值?