ms-access - SQL查询中表名中的减号/连字符
问题描述
我刚刚意识到我在表名中包含减号“-”的 SQL 语句执行时没有错误。例如:
SELECT * from MYTAB-10;
SELECT * from MYTAB-9;
还使用 adodb 对象:
rst.Open "MYTAB-10",conn, adOpenDynamic, adLockOptimistic
...虽然我没有名为 MYTAB-10 的表,但只有 MYTAB。我真的很惊讶,因为从未听说过这样写的表名中的任何运算符。两个版本中的行数(带 - 和不带),不管最后的数字是相同的,那么这里到底发生了什么?到目前为止,我还没有找到任何有关它的信息。这背后有什么理由吗?
解决方案
Access 自动解释之前的分词-
这表示:
SELECT * from MYTAB-10
相当于以下查询
SELECT * FROM MYTAB -10 -- Space added
SELECT * from [MYTAB] AS [-10] -- Explicit alias to make meaning more clear
这也意味着您可以编写以下内容
SELECT [-10].SomeField FROM MYTAB-10 INNER JOIN MYTAB-11 ON [-10].SomeField = [-11].AnotherField
SELECT * FROM
如果您只提供表名,ADO 会自动添加,这是等效的。
但是:永远不要使用它。此行为尚未标准化,并且会使您的代码不可移植,因为其他 RDBMS 会在其上出现语法错误。
另请注意,当直接打开表而不是使用自动生成的 SQL 语句时,这在 ADO 中不起作用:
Set rst = CurrentProject.Connection.Execute("MYTAB-10", Options := adCmdTableDirect)
'Errors: cannot find input table or query MYTAB-10
另请注意:+
角色表现出相似的行为。但是,\
和:
不*
。
推荐阅读
- flutter - 为什么 Future.delayed(Duration(microseconds:n(ps:n<1000)),fun) 比 Future(fun) 快?
- python - 解析和转换 GPS 加密狗的输出
- javascript - 为什么我的 API 从 fetch 调用中获取未定义的值?
- recursion - 在递归函数中处理多种可能的返回类型
- java - logback如何确定线程数和快速记录的可行方式
- python - 你能在 Python 中接受两次套接字连接吗?
- cmake - 在构建“内部”(非根)项目时也适用的分层 CMake 项目
- ubuntu - 在操作系统升级后运行 cargo build(在一个旧的 Rust 项目上)说我缺少几个系统依赖项。这是正常的吗?
- javascript - 哪些引导 css 和 javascript 文件应该链接到我们的 html 页面?
- python - 使用 Dask Dataframe 附加到 Parquet 文件时出错