Access 中部分列的内部联接

Posted

技术标签:

【中文标题】Access 中部分列的内部联接【英文标题】:Inner join on a partial column in Access 【发布时间】:2015-05-11 18:46:52 【问题描述】:

我正在尝试在 MS Access 2010 中连接两个表,其中连接条件为 part of(A.col1) = B.col2。到目前为止,我还无法弄清楚如何做到这一点。

我的两个表有这些关键列:

    表 1 的列 ICD9 Code-Description* 具有如下值:842.00 - Sprain/strain, wrist924.11 - Contusion, knee 表 2 的列 Dx 具有如下值:842924.11

我已经尝试了这两个加入条件:

FROM Table1 
  INNER JOIN Table2 ON Table1.Replace(LTrim(Replace(Left(ICD9Code-Description],
                           (InStr(1,[ICD9Code-Description]," "))-1),"0"," "))," ","0")  
                       = Table2.Dx

SELECT ICD9
  FROM Table2 INNER JOIN 
       (SELECT Replace(LTrim(Replace(Left([ICD9 Code-Description],
              (InStr(1,[ICD9 Code-Description]," "))-1),"0"," "))," ","0") AS ICD9
          FROM Table1)
       ON Diag.DX = ICD9

Access 都不喜欢。

如果可能的话,我想避免将连接条件部分拉到Table1 中自己的列中。

Access 方法是什么?

*不要因为列名而讨厌我。不是我创造的,我只是要支持它。

【问题讨论】:

【参考方案1】:

Val() 函数“将字符串中包含的数字作为适当类型的数值返回。”(请参阅 Access 内置的 Val 函数帮助主题-在帮助系统中。)

对于您的情况,“整洁的事情”是它从字符串中读取字符,直到遇到不能成为有效数字一部分的字符。但它不会引发错误。它只保留它已经收集的数字字符并忽略其余部分。

这是立即窗口中的两个示例...

? Val("842.00 - Sprain/strain, wrist")
 842 
? Val("924.11 - Contusion, knee")
 924.11 

所以Val() 应该使您的JOIN 更简单,即使您还需要将它应用于Table2.Dx 字符串...

FROM
    Table1 INNER JOIN Table2
    ON Val(Table1.[ICD9Code-Description]) = Val(Table2.Dx)

【讨论】:

是的,很遗憾,Table2.D 实际上是一个文本字段。我才意识到这一点。 Str(Val(ICD9Code-Description])) = Table2.Dx 修复了这个问题,但是现在我没有得到任何结果而不是错误。我将不得不再打我的头。好消息是Table2.DxDx = 842 作为文本字符串,而不是Dx=842.00,所以简单的Str() 修复了它。不过,谢谢,Val() 是一个非常有用的功能,并且比之前的灾难更容易阅读! 你先生,真是个天才!!我不确定为什么 Str(val()) = ... 没有,但我会接受它!我还想扼杀设计这个数据库的人,因为他疯狂的列名和列中数据的愚蠢组合,但幸运的是,他不再在这里工作。如果他是,我可能会身陷囹圄……:/ 我很高兴它可以工作,但对我来说似乎有太多的运行时箍。 :-) 如果你被那个桌子设计困住了,我唯一能提供的就是同情。 :-0 修复它的机会来了,但现在,我被困住了,很高兴接受你的同情......

以上是关于Access 中部分列的内部联接的主要内容,如果未能解决你的问题,请参考以下文章

Access 上的内部联接 SQL

带有内部联接和子查询的 Microsoft Access 更新语句

用于 SQL 内部联接的 MS Access 中的括号问题

将 Access SQL 内部联接查询转换为 mySQL 查询的问题

复合键中的右联接 - Access SQL

MS Access 2007 中的 SQL 内部连接