如何更新SQL中的表以使相关字符串匹配?

时间:2009-06-12 09:06:35

标签: sql sql-server sql-server-2005 tsql

假设我有2个表

Table1
ID Path
-- ---- 
1  PathA
2  PathB
3  PathC
4  PathD

Table2
ID Path  Table1ID
-- ----  --------
23 PathA 1
24 PathX 2
25 PathC 3
26 PathZ 4

在上面,PathX应该是PathB,而PathZ应该是PathD

如何将Table2中的所有路径值与表1中的值同步,表可能很大,因此要检查所有不匹配的值并更新它们。 干杯

使用MS SQL Server 2005

5 个答案:

答案 0 :(得分:1)

我想这应该可以解决问题......

UPDATE Table2 SET
    Path = t1.Path
FROM Table2 t2
INNER JOIN Table1 t1 ON
    t1.ID = t2.Table2ID
WHERE
    t1.Path != t2.Path;

编辑:抱歉,我相信我误解了您的请求。我以为你想把Table2的值放到Table1中。我把它改成了另一种方式。

答案 1 :(得分:1)

以下是我认为最简单的:

 UPDATE TableB SET Path = TableA.Path 
 FROM TableA
 WHERE TableB.Id = TableA.ID AND TableB.Path <> TableA.Path

答案 2 :(得分:0)

如果我正确理解您的问题,这将使用table1

中的值更新table2上的路径
Update Table2
    set path = b.path
    From Table2 a
    Left outer join Table1 b
    on a.Table1ID = b.ID
    Where ltrim(rtrim(a.Path)) <> ltrim(rtrim(b.Path))

答案 3 :(得分:0)

您的示例演示了如果不对表进行规范化,您将如何(将)获得异常。

在Table2中,要么存储Table1ID,要么不存储两者,您可以查询另一个(可能会将当前的Table2重新创建为VIEW。无论您为Table2选择哪一列,都要确保在其上有一个引用Table1的外键。

答案 4 :(得分:0)

最好的方式

UPDATE TableB SET Path = TableA.Path 
 FROM TableA
 WHERE TableB.Id = TableA.ID AND TableB.Path <> TableA.Path