2016-08-10 6 views
1

Я использую Microsoft Access. Я по-прежнему новичок в SQL (извините, если мой текущий подход выглядит слишком простым), и я застрял в попытке присоединиться к двум таблицам с разными именами столбцов, в которых одна таблица имеет имена моделей полностью принтеров, тогда как В другой таблице только часть названия принтера.Связать таблицы, основанные на ближайшем текстовом совпадении в SQL-запросах?

Вот некоторые данные образцы

TableA:
Модель
MS811DN ЛАЗЕРНЫЙ ПРИНТЕР
MS811D Т Н ЛАЗЕРНЫЙ ПРИНТЕР
MS812 ЛАЗЕРНЫЙ ПРИНТЕР

TableB: Модель
MS811DTN
MS811DN
MS81 (в котором ничего после MS81 может представлять ничего, кроме MS811DTN или MS811DN)

Я попытался использовать следующее ОТ Заявление: ОТ TableA LEFT JOIN Таблица B ON TableA .MODEL LIKE TableB.Model & «*»

но возвращает повторяющиеся результаты, так как она обеспечивает все значения, что модели «как»

что я ищу, чтобы сделать т О возвращают результаты, которые обеспечивают самое близкое соответствие, например, что Таблица A Таблица B
MS811DN Лазерный принтер ссылки на MS811DN
MS811D Т N Лазерный принтер ссылки на MS811DTN
MS812 Лазерный принтер ссылки на MS81

Есть способ просто вернуть результаты, которые являются ближайшим совпадением?

+0

Стол слишком большой, чтобы быть оснащен колонкой, которая может быть заполнена (возможно, некоторым алгоритмом, затем вручную отрегулирована) значениями, соответствующими ключу из таблицы B?Таким образом, вы можете преобразовать ближайшее совпадение (которое иногда выглядит как угадывание) для точных совпадений. – miroxlav

+0

У меня есть более 30 000 полей в таблице A, которые нужно сопоставить (не уверен, что это считается слишком большим), но вы имели в виду, что перед тем, как вытащить запрос, нужно сопоставить таблицу A с другим столбцом в таблице? Если это так, я хотел бы избежать этого шага, так как я пишу этот запрос для других, чтобы просто копировать и вставлять, когда они извлекают отчет. Если это не то, что вы имели в виду, можете ли вы уточнить? –

ответ

0

Оригинальный выбор в порядке. Как вы упомянули

select ... 
FROM TableA 
    LEFT JOIN Table B ON TableA.Model LIKE TableB.Model&'*' 

Затем мы можем ввести вычисленное поле значения подобия.

LEN(TableB.Model) - LEN(TableA.Model) 

Если 0, мы нашли точный ответ.

Затем вам нужно добавить

GROUP BY TableA.Model 

и найти MIN (подобия) для каждой модели.

Затем оставьте только записи с минимальным подобием.

select * 
FROM TableA INNER JOIN 
    (select TableA.Model, MIN(LEN(TableB.Model) - LEN(TableA.Model)) as minSim 
    FROM TableA 
     LEFT JOIN Table B ON TableA.Model LIKE TableB.Model&'*' 
    GROUP BY TableA.Model) sub ON TableA.Model=sub.Model 
    LEFT JOIN TableB on TableA.Model LIKE TableB.Model&'*' 
        and sub.minSim=LEN(TableB.Model) - LEN(TableA.Model) 

Я не знаком с Access, поэтому синтаксис может быть неправильным. Просто показать идею

+0

Привет, спасибо за быстрый ответ! Я попытался использовать ваше предложение, но по какой-то причине последняя строка "и sub.minSim = LEN (TableB.Model) - LEN (TableA.Model)" не позволяет ему запускаться. Сообщение об ошибке «JOIN expression not supported» продолжает появляться, и когда я принимаю это утверждение, он работает снова. Любая идея, что можно сделать для решения этой проблемы? –

+0

sub.minSim = (LEN (TableB.Model) - LEN (TableA.Model)) как насчет скобок? Я не эксперт в MS Access, чтобы обеспечить точный синтаксис. Вам нужно сохранить сходство и оставить только те, которые с минимальным расстоянием – StanislavL

+0

Синтаксис Microsoft Access так сложно смотреть по сравнению с другими платформами sql. Скобки также не работали, но это сработало, когда я положил последнюю строку в оператор WHERE в конце. Есть ли причина, почему это был бы плохой выбор? –