2016-09-18 47 views
0

假設下表更新表

source(
    id INT, 
    name VARCAHR 
) 

dest(
    id INT, 
    name VARCAHR 
) 

source表既充滿idname;和dest填充有僅name,具有id集到null

有必要更新dest表,並設置id其的id最相似namesource

(由編輯距離計算)爲了更好地理解這是我計劃它是理想的(查詢有語法錯誤):

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 

我無法做出任何reasonab查詢沒有重複功能。

有沒有辦法做到這一點?效率並不重要,但有些合理的解決方案,將不勝感激

回答

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