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