我正在使用MS-Access从2个表中获取信息。我使用了内部联接,左侧,右侧和外部所有变化形式,它将在期望316时拉动1行,测试中所有字段的数据不包含测试1中的字段的值,或者字段中的所有数据来自测试1,没有测试值。我该如何解决?为了保护隐私,必须更改实际字段,但以下是确切的布局。
SELECT [TEST].a,
[TEST].b,
[TEST].c,
[TEST 1].[D],
[TEST].E,
[TEST].F,
[TEST].G,
[TEST].H,
[TEST 1].[I],
[TEST].J,
[TEST].K,
[TEST 1].L,
[TEST 1].[M]
FROM [TEST 1]
INNER JOIN [TEST] ON [TEST 1].[ID] = [TEST].[CLAIMSNO];
答案 0 :(得分:0)
这是一个数据验证和调试练习,因此,如果您不能共享具体的示例数据,那么对于此问题确实没有明确的答案。从技术上讲,根据常见的StackOverflow标准,这可能不负责任,但我现在感到很慷慨。
由于连接的字段是文本,因此有多种可能使其无法匹配:额外的空格,以空字符结尾的字符串,区分大小写(尽管默认情况下,Access应该不区分大小写),宽(Unicode)与窄(ASCII,UTF) -8)编码等。您没有透露数据的来源,也没有透露数据如何加载到数据库中,因此我没有做任何假设。为了了解数据并确定匹配失败的原因,您需要调查字符串的详细信息。您可以通过调查数据值的来源并了解可能的字符范围,编码,字符串终止等来缩小问题的范围。
由于您在匹配数据时遇到了麻烦,并且由于您已经表明原始表没有主键或索引,因此我强烈建议为每个表添加一个具有唯一索引的新AutoNumber字段,也许名为{{ 1}}(用于自动编号ID)。即使已将索引添加到现有列,也要执行此操作。这至少将提供一个可靠的“句柄”,以便在调试其他列时选择和引用特定行。
最大的想法是使用VBA或其他内置函数来检查和报告字符串值的各种属性。您可以通过多种方式来执行此操作,但是我的首选是在常规VBA模块中创建一个公共VBA函数,然后从SQL查询中调用此函数。尽管您可以为每一行执行此操作,但我建议您从每个表中选择您认为应该匹配的行...记录每一行的[AID]
值。如果手动选择的行没有任何启发性的结果,请在整个表上运行它,看看会得到什么有趣的结果。
考虑以下功能:
[AID]
并执行类似于以下内容的查询。假设Public Function CheckSpaces(val As Variant) As String
Dim result As String
If IsNull(val) Then
result = "Null"
ElseIf VarType(val) = VbVarType.vbString Then
If Len(val) = 0 Then
result = "Empty String"
Else
Dim temp As String
Dim n As Integer, m As Integer
n = Len(val)
result = "Length " & n
temp = LTrim(val)
m = Len(temp)
If n <> m Then
result = result & " AND " & (n - m) & " left spaces"
End If
temp = RTrim(val)
m = Len(temp)
If n <> m Then
result = result & " AND " & (n - m) & " right spaces"
End If
End If
Else
result = "Not a string!"
End If
CheckSpaces = result
End Function
Public Function NullChar(val As Variant) As Boolean
Dim result As Boolean
result = False
If Not IsNull(val) Then
If VarType(val) = VbVarType.vbString Then
If InStr(val, vbNullChar) > 0 Then 'vbNullChar = Chr(0)
result = True
End If
End If
End If
NullChar = result
End Function
行[Test 1]
有AID = 10
。同样,假设[ID] == 'name'
的第AID == 20
行有[Test]
:
[CLAIMSNO] = ' name '
和
SELECT [ID], CheckSpaces([ID]), NullChar([ID])
FROM [TEST 1]
WHERE [AID] = 10
比较返回的值。有什么迹象表明比赛失败了吗?