SQL select where 语句中的未知标记

Unknown token in SQL select where statement

提问人:Stalkium 提问时间:10/26/2020 最后编辑:Mark RotteveelStalkium 更新时间:10/26/2020 访问量:1268

问:

我有三张表:

  1. 新闻表:ID,名称
  2. REGIONS 表:ID、NAME

每个“Press”都发布在特定的区域(Regions)中,因此我创建了一个名为“PRESSREGIONS”的子表:

  1. PRESSREGIONS:ID、名称、IDPRESS

当尝试从与当前 PRESS 相关的 PRESSREGIONS 中选择记录时,我使用:

SELECT * FROM PRESSREGION WHERE PRESSREGION.IDPRESS = PRESS.ID

我有以下错误:

错误 -206 令牌未知 PRESS.ID

我什至尝试使用另一个表和另一个字段,只是为了尝试并得到相同的错误。我的陈述有什么问题吗?

德尔福RIO 10.3 - Firedac - 火鸟 3.0

sql select where-子句 firebird

评论

0赞 Uwe Raabe 10/26/2020
从服务器上看到的当前 PRESS 应该是什么?
1赞 Mark Rotteveel 10/26/2020
语句中没有提到任何地方,所以 Firebird 不知道你说的是什么意思。但是,您的查询将产生“列未知”错误,因此您没有提供最小的可重现示例。请使用所有相关信息更新您的问题以重现此内容。PRESSPRESS
0赞 Arioch 'The 10/26/2020
@MarkRotteveel他的清单上说,但他的查询是单数。然而,Whioch 仍然影响不同的错误:Table Unknown - dbfiddle.uk/...PRESSREGIONSPRESSREGION

答:

0赞 Dai 10/26/2020 #1

您需要使用 .JOINPRESS

SELECT
    pr.*,
    p.*
FROM
    PRESSREGION AS pr
    INNER JOIN PRESS AS p ON pr.IDPRESS = p.ID

评论

0赞 Mark Rotteveel 10/26/2020
尽管这可能是也可能不是 OP 想要的,但问题中的查询会在 Firebird 中产生不同的错误(“Column unknown”),因此还有其他事情发生
0赞 Arioch 'The 10/26/2020 #2

你不能使用,因为你没有声明为你要使用的东西。PRESS.idPRESS

“翻译”到 Delphi,您的查询看起来像有两个文件:

Unit A;
inteface
  var AAA: integer;
implementation
end.

然后

Program B;
begin
  AAA := 10;
end.

尝试编译程序 - 您会收到相同的错误,未定义变量 AAA,在编译模块 B 时,Delphi 编译器不知道令牌 AAA。除非您显式声明 B 局部变量 AAA 或显式声明您打算从所有现有单元 () 的单元 A 导入 AAA 变量,否则程序不会编译。Program B; uses A; ...

如果编译器不能绝对保证地知道你打算做什么 - 它不能做猜测,也不能通过一些随机估计为你编写程序。

与 SQL 相同,除非您显式声明表 PRESS(可能带有快捷方式/别名)作为您确实打算使用的东西 - 查询编译器不会知道。

阅读第 6.1.3 章。 Firebird 文档中的 FROM 子句。 或者 Martin Gruber 的“Essential SQL”。 或者有很好的 Delphi 3 和 Delphi 5 俄语的初学者书籍,可能还有其他语言。实际上,关于SQL数据库的“广而通用的范围,浅的深度”的初学者书籍可能比非常详细的“窄范围深入”类型的文档更能为你服务。

在选项上显式声明,这将是,在 SQL'89 风格中“隐式连接”方式

   SELECT * FROM PRESSREGIONs, Press WHERE PRESSREGIONs.IDPRESS = PRESS.ID

上面引用的 Dai 使用 SQL'92“显式连接”风格的另一种选择是

   SELECT * FROM PRESSREGIONs JOIN Press ON PRESSREGIONs.IDPRESS = PRESS.ID

https://dbfiddle.uk/?rdbms=firebird_3.0&fiddle=8f32007629284cf0aa30128d5a7b5e10 上查看更多 SQL 命令和 Firebird 对它们的反应