2011-06-17 26 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