MS Access 内连接不精确匹配(通配符或类似)

Posted

技术标签:

【中文标题】MS Access 内连接不精确匹配(通配符或类似)【英文标题】:MS Access inner join with inexact matching (wildcard or similar) 【发布时间】:2015-12-29 01:23:59 【问题描述】:

我有一个我目前正在处理的 Access 数据库。我有 2 张桌子,我想合并两张桌子。我遇到的问题是我用来匹配两个表的字段并不总是相同的,这意味着我将不得不使用通配符,我不太确定如何做到这一点。

我的两张表的名字是:

ACW,保持

QMT

查询将包含以下字段:

两个表上都存在的 RM 字段。

ACW 来自表 ACT,Hold

Avg Hold 来自表 ACT,Hold

分数来自 QMT 表。

但是,我使用的字段是“RM”,因为它是名称,其中一些是第一个表中的名字姓氏和另一个表中的姓氏。此外,在某些情况下还有额外的字符。有没有办法做到这一点?

我尝试了以下方法,但没有成功:

    SELECT [ACW,Hold].RM, [ACW,Hold].ACW, [ACW,Hold].[Avg Hold], QMT.Score
    FROM [ACW,Hold] INNER JOIN QMT ON [ACW,Hold].RM = QMT.RM & "*";

【问题讨论】:

请按照贡献者容易理解结构的方式格式化您的表格 【参考方案1】:

支持通配符的 SQL 运算符是 LIKE 运算符,因此您的查询应该使用它而不是 = 运算符:

SELECT [ACW,Hold].RM, [ACW,Hold].ACW, [ACW,Hold].[Avg Hold], QMT.Score
FROM [ACW,Hold] INNER JOIN QMT 
    ON [ACW,Hold].RM LIKE QMT.RM & "*";

我刚刚在 Access 2010 中尝试了一个类似的查询,它似乎按预期工作。

更新

如果您需要执行比单个 LIKE 比较所能提供的更复杂的匹配,那么您还可以创建一个 VBA 函数,该函数接受两个字段值作为参数并返回一个布尔值,指示它们是否匹配。例如,像

这样的函数
Option Compare Database
Option Explicit

Public Function DoTheyMatch(product As String, ingredient As String) As Boolean
    Dim result As Boolean
    If product Like ingredient & "*" Then
        result = True
    ElseIf ingredient = "some special thing" And product = "value to match" Then
        result = True
    Else
        result = False
    End If
    DoTheyMatch = result
End Function

您可以将该函数用作 JOIN 的 ON 条件:

SELECT i.Ingredient, i.Supplier, p.Product 
FROM Ingredients i INNER JOIN Products p 
    ON DoTheyMatch(p.Product, i.Ingredient);

我刚刚在 Access 2010 中尝试过,它也有效。

【讨论】:

是的。然而,它起作用了,它并没有拉动一切。我还可以添加其他内容来尝试捕获所有值吗?顺便说一下,我很感谢您的帮助。 那么用一些数据改变“一些特殊的东西”和“要匹配的值”? 是的,就是这样。

以上是关于MS Access 内连接不精确匹配(通配符或类似)的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 加入通配符

如何使用 C# 在 MS-Access 中的查询中使用带有通配符的 LIKE 运算符

MS Access 2007 中的 SQL 内部连接

ms-access 中的左连接和内连接

C# 和 MS Access 之间的数据类型不匹配?

MS Access SQL 中的通配符