Access将在没有where子句的联接中仅从1个表中检索数据

时间:2018-11-26 19:53:13

标签: ms-access

我正在使用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];

1 个答案:

答案 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

比较返回的值。有什么迹象表明比赛失败了吗?