2013-10-08 85 views
1

我有一張表,這是您可能在公司名稱中找到的單詞字典及其同義詞。我想用它來標準化另一個表中的名稱。例如,「WIDGET COMPANY INCORPORATED」將被標準化爲「WIDGET CO INC」。我認爲它會像下面的交叉連接一樣簡單,但它似乎只運行列表中的第一個同義詞,而不是整個列表。我是否以這種錯誤的方式去做?我試圖在SSIS中做這件事,如果我無法弄清楚這一點,但我認爲這會讓事情變得過於複雜 - 當然,我認識到這是一個交叉連接,我們談論了很多行 - 50萬元,要準確...使用交叉連接更新查詢

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 
+0

是。即使連接的另一端有很多,每個目標行只能運行一次UPDATE。該計劃可能有一個「ANY」聚合體,可以從衆多可能的中挑選出一個。 –

+0

我不清楚你想做什麼。你能否提供一些表格結構和樣本數據以及樣本結果。 – HLGEM

+0

@HLGEM - 如果'[公司地址] .Name'是'1街道,倫敦',並且他們有兩個同義詞行'street - > road'和'London - > Big City',我認爲其意圖是運行每個替換反過來所有的同義詞所以最終結果='1路,大城市' –

回答

1

如何像:

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 
+0

警告,爲避免無限循環,您必須確保您的Synonyms表中沒有循環(如'abc'=>'abc';或'abc'= >'xyz'和'xyz'='abc'等) – GilM

+0

哇,完美,謝謝!我已經想出了一個辦法,但你的方式更簡單,更快捷。我不知道爲什麼我沒有想到使用「LIKE」語句,而不是試圖在兩個表中的每個行的組合上運行替換... –

+0

沒問題。它仍然會掃描每個傳遞的兩個表並評估LIKE,但只會在需要它們的行上執行更新。讓SQL Server將它們作爲集合處理比自己循環遍歷行要好得多(如果可以管理的話)。 – GilM