MS Access SQL 切换功能
Posted
技术标签:
【中文标题】MS Access SQL 切换功能【英文标题】:MS Access SQL Switch Function 【发布时间】:2019-06-26 16:22:44 【问题描述】:我有几个具有相同数据结构的表(它们充满了一堆东西,在单独的 .accdb 文件中以说明 2GB 的限制)并且需要根据一个字段从其中一个中检索信息表格。
经过研究,我想出了以下方法,但它似乎不起作用。
SELECT MyNumber, MyName, MyPage, MyDrawing
FROM Switch([Forms]![View_Info]![Contract] = "Contract1", "tblContract1", [Forms]![View_Info]![Contract] = "Contract2", "tblContract2")
WHERE (MyNumber = [Forms]![View_Info]![MyNumber])
FROM 子句中的语法错误。 在此示例中,我只使用了 4 个字段和 2 个表,但实际上我希望检索大约 9 个表和 20 个字段。
有人可以解释一下吗?我很难使用 SQL,所以如果这是非常基本的,我深表歉意。
提前致谢,拉斐尔。
【问题讨论】:
SWITCH()
是一个返回标量值的函数,通常用于SELECT
子句。
这不是真正的问题。在 MS Access 中,FROM
和 JOIN
中不允许引用表的函数。
顺便说一下,考虑重新设计数据库。即使有 MS Access 的单个文件限制,也应该进行规范化。像 tblContract1、tblContract2、... 这样的编号表并不是最佳设置。将所有合同保存在一个数据库中,将其他项目保存在其他数据库中,并根据需要进行链接。
您会惊讶于normalization 无法解决的业务逻辑有多少。如果你找到一个例子,请分享!此外,存储效率更高,避免了冗余和复杂查询,您可以更好地运用参照完整性(一对一、一对多关系)!从今天开始重新设计。祝你好运!
@Parfait 最终进行了重新设计,花了我一段时间,但事情变得更顺利了。感谢您的提示,我很快就会跪下:p
【参考方案1】:
您不能从 SQL FROM 子句中的函数返回表名。如果您的表是动态确定的,那么您必须动态构建 SQL 命令字符串。
Dim tableName As String, sql As String
tableName = Switch(...)
sql = "SELECT ... FROM [" & tableName & "] WHERE ..."
正如@forpas 在his answer 中解释的那样,您可以使用 UNION 查询,但这将始终查询所有表。由于过滤器不是基于表列,因此过滤将发生在客户端,即在您的应用程序中。
【讨论】:
哦抱歉,我有一段时间没有刷新页面了。删除了这部分。【参考方案2】:试试这个联合:
SELECT MyNumber, MyName, MyPage, MyDrawing
FROM tblContract1
WHERE (MyNumber = [Forms]![View_Info]![MyNumber]) AND [Forms]![View_Info]![Contract] = "Contract1"
UNION
SELECT MyNumber, MyName, MyPage, MyDrawing
FROM tblContract2
WHERE (MyNumber = [Forms]![View_Info]![MyNumber]) AND [Forms]![View_Info]![Contract] = "Contract2"
UNION 的每个查询都在 WHERE 子句中包含条件:
[Forms]![View_Info]![Contract] = "Contract?"
【讨论】:
现在为驻留在多个数据库中的 9 个合同表完成此操作!哎哟... OP 在重新设计方面会做得更好。但是这个答案显示了单独命名表所需的复杂查询。 真的吗,9?我应该更好地阅读这个问题。好吧,我不是编写完整代码的人。我希望 OP 知道如何编写其余部分。以上是关于MS Access SQL 切换功能的主要内容,如果未能解决你的问题,请参考以下文章
MS Access Sql 查询不是聚合函数的一部分。使用计数功能
使用拼写检查时使用 VBA 切换字典 (MS Access)
MS Access 查询设计在与 SQL Server 的连接上挂起