Как выполнить группу с учетом регистра в MS Access

В базе данных 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 не учитывает чувствительность к регистру. Например, "andrew" и "Andrew" считаются одним и тем же. Я хочу выполнить группу с учетом регистра, чтобы найти записи различий.

Есть ли способ сделать то же самое в MS Access?

Есть ли другой подход для поиска различий между двумя таблицами с одинаковыми именами столбцов, типами данных и количеством записей 7 00 000?

Я пробовал следующее:

  • Загрузите данные в DataTable и затем найдите разницу. Исключение нехватки памяти из-за большого объема данных.
  • Используйте NOT EXISTS для сравнения строк. Запрос завис, и выполнение так и не было завершено.
  • Подход UNION ALL работает, но проблема в том, что GROUP BY не учитывает чувствительность к регистру.

person Dukhabandhu Sahoo    schedule 06.12.2017    source источник
comment
С# или доступ??   -  person Gustav    schedule 06.12.2017
comment
Я выполняю запрос в базе данных MS Access через C# OleDbConnection.   -  person Dukhabandhu Sahoo    schedule 06.12.2017
comment
Если это так, я не уверен, вы можете вызывать функции VBA в Access. Но вы можете выбрать значение ASCII для первого символа, если вас это волнует. Для большего количества последующих символов вы можете расширить это, используя MID.   -  person Gustav    schedule 06.12.2017


Ответы (2)


Вы можете сгруппировать по значению байта:

? 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] 
person Gustav    schedule 06.12.2017
comment
Поскольку это из С# (предположение, поскольку вопрос помечен как С#), вы, вероятно, не можете использовать UDF - person Erik A; 06.12.2017
comment
Я заметил, но: Есть ли способ сделать то же самое в MS Access? Итак? - person Gustav; 06.12.2017
comment
Как говорится, это предположение. Если на самом деле это просто доступ, тег C# следует удалить. - person Erik A; 06.12.2017

Можете ли вы не указывать OPTION COMPARE BINARY в модуле для выполнения поиска с учетом регистра?

Эта ветка https://access-programmers.co.uk/forums/showthread.php?t=33962 и этот Как написать регистрозависимый запрос для MS Access? оба метода описывают разные.

person Minty    schedule 06.12.2017
comment
Я не хочу выполнять действие поиска, а группировать по запросу. - person Dukhabandhu Sahoo; 06.12.2017
comment
Извините, я пропустил это тонкое различие в вопросе - это может помочь через-microsoft-jet" rel="nofollow noreferrer">support.microsoft.com/en-gb/help/244693/ - person Minty; 06.12.2017