2011-06-17 50 views
1

我需要比較和匹配兩個不同表中兩個字符串的最長匹配,並在有最接近的匹配時更新一個值。如何匹配最長的字符串並更新值?

Table 1  Table 2 
stack1  stack2 
ABCDEFG ABC 
GHIJKLM ABCDE 
PQRSUVW ABCDEF 

我需要比較這兩個表並匹配closeet一個和更新表1第一排爲ABCDEF最接近的匹配,請誰能幫助我。我被困在這裏。

這裏是我的查詢

UPDATE table1 A 
    SET A.stack1 = (SELECT DISTINCT B.stack2 
        FROM table2 B 
        WHERE A.stack1 LIKE CONCAT(B.stack2,'%')) 
WHERE name = 'name'; 

與此查詢我得到一個錯誤稱爲

ORA-01427:單行子查詢返回不止一行

+0

您有兩個問題:a)子選擇返回多行; ''A.stack1 in('應該解決這個問題。b)你不能更新一個具有將在子查詢中使用的值的表(這可能只有當你的子查詢包含你正在更新的表時)。 – Suroot 2011-06-17 03:36:43

回答

1

您需要使子查詢僅返回單個匹配(最長的一個)。在你的情況MAX應該這樣做。

UPDATE table1 A 
SET A.stack1 = (SELECT Max(B.stack2) 
       FROM table2 B 
       WHERE A.stack1 LIKE CONCAT(B.stack2,'%')) 
WHERE name = 'name'; 

此外,你應該考慮沒有任何匹配的情況。

+0

非常感謝,它的作品:)如何標記此問題爲答案? – sailaja 2011-06-17 03:43:38

+0

@sailaja:點擊答案左側箭頭下方的複選標記。 – 2011-06-17 03:45:22

+0

MAX不返回最長,它返回最大值。您需要從子查詢中的table2中返回stack2,其長度與table2中堆棧2的最大長度相匹配。 (你將仍然需要返回值的MAX或MIN,因爲可能有多於一個字符串具有最大長度。) – Datajam 2011-06-17 09:06:23

0

的ORA -01427錯誤是說子查詢返回多個值 - 即使使用DISTINCT

您需要更正返回多個不同值的個案。這可能是一個集合函數,如MAXMIN,但沒有詳細信息,我不願意提出該建議。

+0

與此查詢得到ORA-00927:缺少等號錯誤 – sailaja 2011-06-17 03:40:22

+0

@sailaga:原諒我急躁的回覆,並看到我的更新 – 2011-06-17 03:43:21