У меня есть интересная / разочаровывающая проблема, решение которой у меня уже есть - однако она медленная, и я не уверен, что это лучший способ ее решения.
У меня есть две таблицы, к которым я хочу присоединиться.Первое я буду называть [MobileNumber], а второе [MobileInventory].Таблица [MobileNumber] содержит числа в формате 7123456789. Таблица [MobileInventory] содержит числа, которые могут иметь любой из следующих трех форматов - 7123456789, 07123456789, +447123456789.Мне нужно объединить два, и единственное общее поле - это номер мобильного телефона.
Эти две проблемы заключаются в том, что в [MobileInventory] я не могу гарантировать формат (экспорт из внешней системы) и числа в обеих таблицахони из разных стран с разными кодами длины (+1, +44, +852) и в пределах [MobileNumber] я не могу сказать, из какой страны номер.Это делает очень трудным просто удалить первые x символов из [MobileInventory] или выполнить замену в любом известном коде страны (рискованно!) И выполнить.
Мое решение ( работает )):
SELECT *
FROM [MobileNumber]
LEFT OUTER JOIN [MobileInventory]
ON CHARINDEX(REVERSE([MobileNumber].[Number]), REVERSE([MobileInventory]),1) = 1
Если оба числа поменялись местами, легко увидеть, если вы получаете позицию [MobileNumber]. [Number] в [MobileInventory]. [Mobile] и если результат равен 1 - это совпадение.
9876543217
98765432170
987654321744 +
98765432174400
Это работает, и я получаю очень хороший результат совпадения - однако,это так медленно!У меня есть номера c.50k в [MobileNumber] и c.20k в [MobileInventory].
Следующее, что нужно попробовать, - это (как я использую результат выше в MERGE в хранимой процедуре), чтобывозьмите GUID из [MobileInvetory] и сохраните в [MobileNumber] для последующих объединений просмотра, так что я мог бы добиться этого, используя курсор в курсоре для сравнения, но я не уверен, что это будет быстрее.
Я проверил похожие вопросы, и, похоже, что решенные проблемы связаны с разделителями или последовательными кодами стран, которые не относятся к моей проблеме.
Вышеуказанное автоматизировано с помощью запланированной задачи,так что я мог бы просто начать его раньше, но это как-то не так!