Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL中更新表,使相关字符串匹配?_Sql_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

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

如何在SQL中更新表,使相关字符串匹配?,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,假设我有两张桌子 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 如何将表2中的所有路径值与表1中的值同步,表可能很大,因此希望检查所有不匹配的值并更新它们。 干杯 使用MS S

假设我有两张桌子

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

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


使用MS SQL Server 2005

我想这应该可以做到

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

编辑:对不起,我想我误解了你的要求。我以为你想把表2的值变成表1。我已将其改为另一种方式。

如果我正确理解了您的问题,这将使用表1中的值更新表2中的路径

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))
更新表2
设置路径=b.path
来自表2 a
左外连接表1b
在a.Table1ID=b.ID上
其中ltrim(rtrim(a.Path))ltrim(rtrim(b.Path))

我认为以下是最简单的:

 UPDATE TableB SET Path = TableA.Path 
 FROM TableA
 WHERE TableB.Id = TableA.ID AND TableB.Path <> TableA.Path
updatetableb SET Path=TableA.Path
从表格
其中TableB.Id=TableA.Id和TableB.Path TableA.Path

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

在Table2中,可以存储Table1ID或Path,但不能同时存储两者,您可以查询另一个(可能将当前Table2重新创建为视图)。无论您为Table2选择哪一列,请确保其上有一个引用Table1的外键。

最佳方法

UPDATE TableB SET Path = TableA.Path 
 FROM TableA
 WHERE TableB.Id = TableA.ID AND TableB.Path <> TableA.Path
updatetableb SET Path=TableA.Path
从表格
其中TableB.Id=TableA.Id和TableB.Path TableA.Path

您是否考虑过对其进行重构。通过将Table1ID放在Table2的行中,您就不需要在Table2中使用Path字段。一旦这样做(忘记可能需要更改的任何其他代码)你不会再有这个问题了。嗨,是的,我知道,但它是一个大型遗留系统的一部分,在部署到客户时我没有参与,但我会在以后的设计中应用它。清除数据后,应用FK和更新级联引用操作;如果至少有一列可为空,则需要保留使用触发器将它们同步。