首页 > 解决方案 > 在 MS Access 2016 中使用 JOIN 查询长文本格式的字段

问题描述

我有两个几乎相同的查询。唯一的区别是要连接的字段的格式。一个有效,另一个无效。

连接两个整数字段的查询完美运行。

联接两个长文本字段的查询会产生以下错误:“无法加入备注、OLE 或超链接对象 (alarmlogwithstring2.[Tag_Value]=ECLString.[Tag_Value])。”

功能查询:

SELECT alarmlogwithdescs.TableIndex, alarmlogwithdescs.Date_Stamp, alarmlogwithdescs.Time_Stamp, alarmlogwithdescs.Tag_Name, alarmlogwithdescs.Tag_Value, ErrorCodeLookup.ErrorDescription
FROM ErrorCodeLookup INNER JOIN alarmlogwithdescs ON ErrorCodeLookup.[Tag_Value] = alarmlogwithdescs.[Tag_Value]
ORDER BY alarmlogwithdescs.TableIndex;

非功能查询:

SELECT alarmlogwithstring2.TableIndex, alarmlogwithstring2.Date_Stamp, alarmlogwithstring2.Time_Stamp, alarmlogwithstring2.Tag_Value, ECLString.ErrorDescription
FROM alarmlogwithstring2 INNER JOIN ECLString ON alarmlogwithstring2.[Tag_Value] = ECLString.[Tag_Value]
ORDER BY alarmlogwithstring2.TableIndex;

我试过的:

1.) 我将“FROM”后面的表替换为 ECLString,并进行了所有必要的更改。(即,然后,在 INNER JOIN 之后,我将 ECLString 更改为 alarmlogwithstring2 等...)这使得两个查询更加相同,但不应该对结果产生影响。为了确定,我对功能查询做了同样的事情。功能性的仍然有效,而非功能性的仍然不...

2.) 我尝试将查找表的 Tag_Value 字段设为短文本,同时保留实际数据表的 Tag_Value 字段长文本。没有效果。

3.) 在创建两个表之间的关系时,我尝试更改 JOIN 类型。没有效果。

4.)更改alarmlogwithstring2.[Tag_Value]=ECLString.[Tag_Value]CAST(alarmlogwithstring2.[Tag_Value] AS varchar(max)) = CAST(ECLString.[Tag_Value] AS varchar(max))并收到以下错误:

“查询表达式 CAST(alarmlogwithstring2.[Tag_Value] AS varchar(max)) = CAST(ECLString.[Tag_Value] AS varchar(max)) 中的语法错误(缺少运算符)。”

无论出于何种原因,在单击“确定”关闭错误消息后,逗号后面的逗号SELECT alarmlogwithstring2.TableIndex,会突出显示,表明缺少的运算符在那里。好的?

任何帮助将不胜感激。感谢您的时间!


知道了!至少适用于我的情况。任何其他这样做的方法仍然会受到赞赏。

这对我有用,因为我的 Tag_Value 字段包含诸如“Error0、Error1、Error2”等文本...

所以,我使用了以下代码:

SELECT alarmlogwithstring2.TableIndex, alarmlogwithstring2.Date_Stamp, alarmlogwithstring2.Time_Stamp, alarmlogwithstring2.Tag_Value, ECLString.ErrorDescription
FROM alarmlogwithstring2 INNER JOIN ECLString ON Right( alarmlogwithstring2.[Tag_Value] , 1) = Right(ECLString.[Tag_Value], 1)
ORDER BY alarmlogwithstring2.TableIndex;

这是因为我的 Tag_Value 文本末尾的整数。使用 Right(string,length) 函数只会比较每个值中的整数,因为它们都在值的右侧。

如果你的情况和我类似,那么上面的代码就可以了;但是,如果您的错误代码(或其他)数量达到两位数,请务必在两个表的字段中反映这一点。(即 Make Error0 => Error00、Make Error1 => Error01 等)在两个表中并使用 Right(string,2) 而不是 Right(string,1)。[似乎很明显,但可能并不适合所有人。]

但是,对我和其他所有人来说,情况并非总是如此。例如,某人可能有纯文本。因此,同样,如果您知道另一个更通用的解决方案,请告诉我,我会让您的答案成为这个问题的答案。

谢谢!

标签: sqlms-access-2016

解决方案


知道了。一般解决方案见下文。它用于StrComp(string1,string2)=0匹配字符串。

SELECT alarmlogwithstring2.TableIndex, alarmlogwithstring2.Date_Stamp, alarmlogwithstring2.Time_Stamp, alarmlogwithstring2.Tag_Name, alarmlogwithstring2.Tag_Value, ECLString.ErrorDescription
FROM alarmlogwithstring2 INNER JOIN ECLString ON StrComp(alarmlogwithstring2.[Tag_Value], ECLString.[Tag_Value]) = 0
ORDER BY alarmlogwithstring2.TableIndex;

推荐阅读