【问题标题】:How to resolve SQL error when fetching data from a foreign data table in Postgres从 Postgres 中的外部数据表中获取数据时如何解决 SQL 错误
【发布时间】:2023-04-01 20:14:01
【问题描述】:

我有一个使用tds_fdw 创建的外部数据表,它将 MSSQL 服务器上的 SQL 视图映射到 Postgres 中的外部表。我可以毫无问题地查看和查询该表中的数据。但是,当我尝试从连接外部表和其他几个表的查询中查询此表时,出现此错误。

错误是:

[2020-07-28 14:04:25] [HV00L] ERROR: DB-Library error: DB #: 20018, DB Msg: General SQL Server error: Check messages from the SQL Server, OS #: -1, OS Msg: , Level: 15
[2020-07-28 14:04:25] [00000] DB-Library notice: Msg #: 156, Msg state: 1, Msg: Incorrect syntax near the keyword 'as'., Server: DB1DBSSVR1, Process: , Line: 1, Level: 15

这就是 SQL 查询的样子

SELECT COL1, COL2, COL3 FROM (
    SELECT a.COL1, b.COL2, c.COL3 FROM 
        PSQL_TABLE_1 a JOIN PSQL_TABLE_2 b ON a.ID = b.ID
        JOIN FOREIGN_TABLE f on b.ID = f.CODE WHERE a.COL5 = 'S'
    UNION ALL
    SELECT a.COL1, b.COL2, c.COL3 FROM 
        PSQL_TABLE_1 a JOIN PSQL_TABLE_3 b ON a.ID = b.ID
        JOIN FOREIGN_TABLE f on b.ID = f.CODE WHERE a.COL5 = 'S'
) 
DERIVED WHERE DERIVED.SEQ_NO = 'xxxx'

注意
早些时候,这个查询使用了一个本地 pg 表,它与外部表具有相同的名称和结构,并且工作正常。此问题在重命名并创建具有相同名称和结构的新外部表后开始

【问题讨论】:

  • 这个查询在哪里运行,在 SQL Server 或 Postgres 上?错误还说:Incorrect syntax near the keyword 'as'. 并且您显示的查询中没有as。这是来自视图查询吗?还有你从哪个日志中得到错误?
  • @Adrian 查询在 Postgres 上执行。错误来自我展示的查询。我从 Postgres 日志中收到此错误。我正在运行 tds_fdw 并启用了日志消息
  • 嗯,错误很明显,问题出在as 关键字附近。我在查询中没有看到 as。那么,您确定在匿名化查询时没有将其编辑掉吗?您是否还按照消息提示检查了 SQL Server 日志?
  • 另见答案。
  • @Isuru Pathirana 。很确定这与通过tds_fdw 运行有关,更何况现在你说在本地运行它所有工作。根据我在下面的评论,您是否尝试过将 DERIVED 重命名为 DERIVED_TABLE 之类的名称?

标签: sql-server postgresql freetds foreign-data-wrapper


【解决方案1】:

啊,现在我明白了。很确定是这样的:

DERIVED WHERE DERIVED.SEQ_NO = 'xxxx'.

DERIVED 是一个关键字,在它之前有一个隐含的as。将该别名更改为另一个名称或引用它。

【讨论】:

  • 这在 SQL Server 中似乎不是问题:dbfiddle.uk/…
  • 我遵循这里的建议:postgresql.org/docs/12/sql-keywords-appendix.html "作为一般规则,如果您收到包含任何列出的关键字作为标识符的命令的虚假解析器错误,您应该尝试将标识符引用到看看问题是否会消失。”或者我改个名字。
  • 嗯,对 Postgres 来说似乎也不是问题:dbfiddle.uk/…
  • 是的,我知道这一点。但似乎双方都没有问题。仅将 tds_fdw 作为向查询中添加额外 as 的可能原因。但它也可能是查询工具。不会是第一个在用户不知情的情况下尝试变得聪明并在查询中添加内容的人
  • 您是否尝试将DERIVED 重命名为DERIVED_TABLE 之类的名称?
【解决方案2】:

问题似乎是由于我用于连接的字段中的一些数据值造成的。一旦我修剪数据,错误就消失了。新查询看起来像,

SELECT COL1, COL2, COL3 FROM (
    SELECT a.COL1, b.COL2, c.COL3 FROM 
        PSQL_TABLE_1 a JOIN PSQL_TABLE_2 b ON a.ID = b.ID
        JOIN FOREIGN_TABLE f on btrim(b.ID) = f.CODE WHERE a.COL5 = 'S'
    UNION ALL
    SELECT a.COL1, b.COL2, c.COL3 FROM 
        PSQL_TABLE_1 a JOIN PSQL_TABLE_3 b ON a.ID = b.ID
        JOIN FOREIGN_TABLE f on btrim(b.ID) = f.CODE WHERE a.COL5 = 'S'
) 
DERIVED WHERE DERIVED.SEQ_NO = 'xxxx'

此查询按预期返回值。但是我仍然想知道为什么它会报错说as附近有语法错误。

【讨论】:

  • 这很奇怪。 ID中是否有as?否则我不知道为什么会出现语法错误。
  • 如果你还没有,我唯一能想到的就是将 postgresql.conf 中的 log_statement 更改为 all 并重新加载服务器。然后运行两种查询变体并查看发送到服务器的内容。然后将log_statement 设置回来。
猜你喜欢
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 2021-04-07
相关资源
最近更新 更多