2011-06-09 68 views
2

我有一個需要連接的表,但是在其中一個表中,我需要從每行的varchar字段中提取一個鍵。MS SQL - 在一個列中使用子串密鑰連接兩個表

表1說明(數字18,VARCHAR 4000)

descriptionid description 
    1    Blah Blah: Queue 1Blah Blah 
    2    foobar:Queue 2 
    3    rem:Queue 2 -This is a note 
    4    Anotherrow: Queue 3 
    5    Something else 

表2隊列 - (數字18,VARCHAR 100)

queueid queue 

    123  Queue 1 
    124  Queue 2 
    127  Queue 3 
    129  Queue 4 

所以我需要產生像這樣

輸出

查看3隊列描述(數字18,數字18)

descriptionid queueid 
    1    123 
    2    124 
    3    124 
    4    127 
    5    null 

因此,在表1第1行中,我需要從描述中去除Queue1值,驗證它是否在隊列表中,然後查找queueid。

我無法改變表1的結構和2

可這MSSQL達到什麼樣的方式?

在SQL中使用MSSQL 2005最有效的方法是什麼?

回答

2

最有效的方式

嗯......不知道這些,但它是一個途徑。

select T1.descriptionid, 
     T2.queueid 
from Table1 as T1 
    left outer join Table2 as T2 
    on T1.description like '%'+T2.queue+'%' 

另一種方式

select T1.descriptionid, 
     T2.queueid 
from Table1 as T1 
    left outer join Table2 as T2 
    on charindex(T2.queue, T1.description, 1) > 0 

如果有一個以上的匹配(見埃德哈珀評論)你可以用它來挑選一個最長的比賽。

select T1.descriptionid, 
     T2.queueid 
from Table1 as T1 
    outer apply ( 
       select top 1 T3.queueid 
       from Table2 as T3 
       where charindex(T3.queue, T1.description, 1) > 0 
       order by len(T3.queue) desc 
      ) as T2(queueid) 
+0

欣賞這可能不是最有效的方式,但是我接受它作爲答案,因爲我只需要在此過夜生成報告表。 – brianilland 2011-06-09 09:51:33

+0

當超過9個隊列時,這不會產生錯誤匹配的風險嗎?表1中的字符串中的「隊列11」將與表2中的「隊列1」和「隊列11」匹配。 – 2011-06-09 15:47:48

+0

@Ed Harper - 你是對的。增加了一個可以選擇最長匹配的版本。 – 2011-06-09 18:00:22

1

執行此操作的最有效方法是向表中添加一個額外的列,並從字符串中插入提取的ID。您可以在添加行時執行此操作,並且可以輕鬆處理現有的操作。但試圖像這樣離開加入將非常緩慢。

+0

不幸的是,我無法更新這些表格。它們僅用於報告。你有沒有一個可以實現這個目標的左連接例子?我可以每晚創建一個新表以根據查詢進行報告。 – brianilland 2011-06-09 09:26:53

0

在Sql Server 2005中,您可以使用正則表達式提取您的隊列字符串。該Data Extraction section on this page contains an example

在存儲過程中,您可以構建一個包含新列的索引臨時表 - 這允許您在不更改表元數據的情況下執行此操作。

如果你可以改變表的元數據,您可以:

觸發的內容轉換成另一列(插入)。

或者如果信息不是立即需要的話,日常的sql作業可以提取信息。