2016-09-18 2 views
0

Пусть следующие таблицыОбновление таблицы с максимальным результатом функции из другой таблицы

source(
    id INT, 
    name VARCAHR 
) 

dest(
    id INT, 
    name VARCAHR 
) 

Где source таблица заполнена как id и name; и dest заполнен только name, имеющий id набора для null

Необходимо обновить dest таблицы и установить id который является id из наиболее близки name (рассчитываются путем Левенштейн расстояния) от source стола

Для лучшего понимая, что это так, как я планировал это идеально (запрос имеет синтаксическую ошибку):

UPDATE dest 
SET dest.id = (
    SELECT source.id, levenstein_ratio(dest.name, source.name) as similarity 
    FROM source 
    GROUP BY similarity HAVING similarity > 50 
    ORDER BY similarity DESC 
    LIMIT 1 
).id 

Я не мог сделать никакой причины le запрос без повторяющейся функции.

Есть ли способ сделать это? Эффективность не имеет решающего значения, но несколько разумное решение будет оценено

ответ

0

Вы устанавливаете dest.id требуется одно значение, возвращаемое из выбора, так что вы должны реорганизовать запросе, например: этот путь

UPDATE dest 
SET dest.id = (
    SELECT source.id 
    FROM source 
    GROUP BY levenstein_ratio(dest.name, source.name) 
    HAVING levenstein_ratio(dest.name, source.name) > 50 
    ORDER BY levenstein_ratio(dest.name, source.name) DESC 
    LIMIT 1 
) 
+0

Я понимаю, но это требует повторяющегося вызовите ту же функцию. Я бы хотел избежать этого – Eugene

+0

Если вам нужен рабочий запрос ... я не знаю другого способа ... потому что (я повторяю) у вас должен быть единственный результат в выборе для присвоения этому заданному полю. ..... это означает, что вы не можете определить сходство с псевдонимами, а затем, если вы не можете использовать псевдоним. уникальный способ - повторить исходный код. – scaisEdge