【问题标题】:MS Access SQL Switch FunctionMS Access SQL 切换功能
【发布时间】: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 中,FROMJOIN 中不允许引用表的函数。
  • 顺便说一下,考虑重新设计数据库。即使有 MS Access 的单个文件限制,也应该进行规范化。像 tblContract1tblContract2、... 这样的编号表并不是最佳设置。将所有合同保存在一个数据库中,将其他项目保存在其他数据库中,并根据需要进行链接。
  • 您会惊讶于normalization 无法解决的业务逻辑有多少。如果你找到一个例子,请分享!此外,存储效率更高,避免了冗余和复杂查询,您可以更好地运用参照完整性(一对一、一对多关系)!从今天开始重新设计。祝你好运!
  • @Parfait 最终进行了重新设计,花了我一段时间,但事情变得更顺利了。感谢您的提示,我很快就会跪下:p

标签: sql ms-access


【解决方案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 知道如何编写其余部分。
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2017-04-24
相关资源
最近更新 更多