Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Tsql 使用交叉联接更新查询_Tsql_Sql Server 2005 - Fatal编程技术网

Tsql 使用交叉联接更新查询

Tsql 使用交叉联接更新查询,tsql,sql-server-2005,Tsql,Sql Server 2005,我有一个表格,是一本字典,里面有你可能在公司名称中找到的单词,以及它们的同义词。我想用它来标准化另一个表中的名称。例如,“WIDGET COMPANY INCORPORATED”将标准化为“WIDGET CO INC”。我原以为它会像下面的交叉连接一样简单,但它似乎只适用于列表中的第一个同义词,而不是整个列表。我走错方向了吗?如果我不能弄明白这一点,我会尝试在SSIS中执行,但我认为这会使一项相对简单的任务变得过于复杂。。。当然,我意识到,因为这是一个交叉连接,我们讨论了很多行-准确地说是500

我有一个表格,是一本字典,里面有你可能在公司名称中找到的单词,以及它们的同义词。我想用它来标准化另一个表中的名称。例如,“WIDGET COMPANY INCORPORATED”将标准化为“WIDGET CO INC”。我原以为它会像下面的交叉连接一样简单,但它似乎只适用于列表中的第一个同义词,而不是整个列表。我走错方向了吗?如果我不能弄明白这一点,我会尝试在SSIS中执行,但我认为这会使一项相对简单的任务变得过于复杂。。。当然,我意识到,因为这是一个交叉连接,我们讨论了很多行-准确地说是5000万行

update [dbo].[Company addresses]
set [Name 1 syn] = replace(a.[Name 1 syn], ' ' + b.[Synonym] + ' ', ' ' + b.[Base] + ' ')
from [dbo].[Company addresses] a
cross join dbo.Synonyms b

比如说:

DECLARE @RC int = 1;

WHILE @RC > 0
BEGIN
  update [dbo].[Company addresses]
  set [Name 1 syn] = replace(a.[Name 1 syn], ' ' + b.[Synonym] + ' ', ' ' + b.[Base] + ' ')
  from [dbo].[Company addresses] a
  inner join dbo.Synonyms b on a.[Name 1 syn] LIKE '% ' + b.[Synonym] + ' %';

  SET @RC = @@ROWCOUNT;
END

UPDATE
仅在每个目标行上运行一次,即使连接的另一侧有许多行。这个计划可能有一个
ANY
集合,可以从许多可能的集合中选择一个。我不清楚你想做什么。你能提供一些表格结构、样本数据和样本结果吗。@HLGEM-如果
[公司地址]。Name
1街,伦敦
他们有两行同义词
街道->道路
伦敦->大城市
我想目的是将每个替换词依次替换所有同义词,因此最终结果=
1道路,大城市
没错,谢谢Martin。看起来你是对的-它只在每个目标行运行一次。。。我目前正在研究如何通过WHILE循环来实现这一点,请参阅本文:。我仍然希望有一个更简单的方法…警告,为了避免无限循环,您必须确保同义词表中没有循环(如'abc'=>'abc';或者'abc'=>'xyz'和'xyz'='abc'等)。哇,太好了,谢谢!我已经想出了一个方法,但你的方法更简单、更快。我不知道为什么我没有想到使用“LIKE”语句,而不是尝试在两个表中的每一行组合上运行replace…没问题。它仍然会为每个过程扫描两个表并进行类似的计算,但只会对需要它们的行执行更新。让SQLServer将它们作为集合处理比自己循环行要好得多(如果您可以管理的话)。