Как сопоставить данные двух таблиц посредством сравнения колонок с текстом, учитывая при этом регистр?
У меня есть 2 таблицы, в обеих одинаковое количество строк. В каждой из них есть столбец с наименованием, данные столбцы у обеих таблиц совпадают. Мне необходимо написать запрос, который добавляет один столбец второй таблицы к первой, по соответствию наименований. Проблема в том, что в обеих таблицах есть наименования типа: TESTName и Testname, при сопоставлении MS SQL их не различает, и добавляет в результате запроса лишнее значение.
SELECT [Name],
[Count],
[Manufacturer],
[Country]
FROM [TestDB].[dbo].Engines
INNER JOIN [Machines] ON Engines.Name = Machines.Name
ORDER BY [Count] DESC
Я пытался использовать СOLLATE для сопоставления с учетом регистра, а также настроить фильтр оставляющий значения с уникальным "Name" в результирующем запросе, используя GROUP BY или DISTINCT, но у меня не вышло (GROP BY вечно ругался на недопустимость его использования в данном запросе... А DISTINCT мне не удавалось написать с сохранением всех необходимых данных в результирующей выборке...)
(MS SQL Server 2019)
Ответы (2 шт):
Я только начинаю изучать основы работы с БД, поэтому не сразу дошёл до, возможно, самого логичного и простого решения данной задачи. Формирование связи один к одному, между двумя таблицами решило проблему сопоставления данных при объединении. Сделав INNER JOIN по соответствию id сущности 1й таблицы и ее ключом во 2й, данные отобразились корректно.
СOLLATE нужно указать с двух сторон, и он должен включать в название CS(Case Sensitivity), так должно отработать:
SELECT [Name],
[Count],
[Manufacturer],
[Country]
FROM [TestDB].[dbo].Engines
INNER JOIN [Machines] ON Engines.Name COLLATE CYRILLIC_GENERAL_CS_AS = Machines.Name COLLATE CYRILLIC_GENERAL_CS_AS
ORDER BY [Count] DESC