如何在MS Access

时间:2017-12-06 06:57:53

标签: c# ms-access group-by union-all ms-access-2016

在MS Access数据库中查找两个表(Employee和Employee_PROD)之间的不匹配(即差异)记录我使用 UNION ALL 。查询如下:

SELECT [COMPANY],[DEPT],[DOJ],[EMP_ID],[Name],[SUB_COMPANY] FROM 

(SELECT '[Employee]' AS TableName,[COMPANY],[DEPT],[DOJ],[EMP_ID],[Name],[SUB_COMPANY] FROM [Employee] 

UNION ALL 

SELECT '[Employee_PROD]' AS TableName,[COMPANY],[DEPT],[DOJ],[EMP_ID],[Name],[SUB_COMPANY] FROM [Employee_PROD] ) 

GROUP BY [COMPANY],[DEPT],[DOJ],[EMP_ID],[Name],[SUB_COMPANY] 
HAVING COUNT(*) = 1 AND MIN(TableName) = '[Employee]'

我面临的问题是GROUP BY没有考虑区分大小写。例如,“ a ndrew”和“ A ndrew”被视为相同。我想以区分大小写的方式执行分组以查找差异记录。

有没有办法在MS Access中做同样的事情?

是否有其他方法可以找到具有相同列名,数据类型和记录数的两个表之间的差异为7,00,000?

我尝试了以下内容:

  • 将数据加载到DataTable,然后找出差异。由于存在大量数据而导致内存不足。
  • 使用NOT EXISTS比较行。查询被绞死,执行从未完成。
  • UNION ALL方法正在运行,但问题是GROUP BY没有考虑区分大小写。

2 个答案:

答案 0 :(得分:0)

您可以按字节值分组:

? StrToByte("Andrew")
416E64726577
? StrToByte("andrew")
616E64726577

虽然你拥有大量数据可能会有点慢。

Public Function StrToByte(ByVal strChars As String) As String

  Dim abytChar()  As Byte
  Dim lngChar     As Long
  Dim strByte     As String

  abytChar() = StrConv(strChars, vbFromUnicode)

  strByte = Space(2 * (1 + UBound(abytChar) - LBound(abytChar)))
  For lngChar = LBound(abytChar) To UBound(abytChar)
    Mid(strByte, 1 + 2 * lngChar) = Hex(abytChar(lngChar))
  Next

  StrToByte = strByte

End Function

仅限SQL,如果您只关注第一个字符,请尝试:

GROUP BY [COMPANY],[DEPT],[DOJ],[EMP_ID],[Name], ASC([Name]),[SUB_COMPANY] 

答案 1 :(得分:0)

您是否可以在模块中指定OPTION COMPARE BINARY来执行区分大小写的搜索?

这个帖子https://access-programmers.co.uk/forums/showthread.php?t=33962和这个How to write Case Sensitive Query for MS Access?都描述了不同的方法。