2011-02-03 65 views
4

請記住我使用SQL 2000幫助一個複雜的連接查詢

我有兩個表。

tblAutoPolicyList含有一種叫PolicyIDList場。

tblLossClaims包含兩個字段名爲LossPolicyID & PolicyReview

我寫一個存儲過程將從PolicyIDList領域,循環得到明顯PolicyID通過LossPolicyID場(如果發現匹配,設置PolicyReview爲「Y」)。

樣品表的佈局:

PolicyIDList  LossPolicyID 
9651XVB19  5021WWA85, 4421WWA20, 3314WWA31, 1121WAW11, 2221WLL99  Y 
5021WWA85  3326WAC35, 1221AXA10, 9863AAA44, 5541RTY33, 9651XVB19  Y 
0151ZVB19  4004WMN63, 1001WGA42, 8587ABA56, 8541RWW12, 9329KKB08  N 

我怎麼會去編寫存儲過程(尋找邏輯比語法以上)?

請記住我使用SQL 2000

+0

所以你正在編寫一個存儲過程來反規範化的數據模型? – diagonalbatman 2011-02-03 17:42:20

+0

PolicyIDList字段是帶有分隔的策略ID列表的單個字段嗎? (AAAA BBBB CCCC或AAAA,BBBB,CCCC)? – jbehren 2011-02-03 17:47:56

回答

0

如果PolicyIDList字段是一個分隔的列表,你必須先分開個別政策ID和創建臨時表與所有的結果。接下來,在與tblLossClaims使用更新查詢「,其中存在(來自#temptable TT其中tt.PolicyID = LossPolicyID選擇*)。

根據表/數據的大小,您可能希望將索引添加到臨時表中。

1

基本上,這個想法是這樣的:

  1. 「展開」 tblLossClaims和返回兩個列:tblLossClaims鍵(你沒有提到任何,所以我想這將是LossPolicyID)和Item =從LossPolicyID單個項目。

  2. 查找tblAutoPolicyList.PolicyIDListunrolled.Item的匹配項。

  3. tblLossClaims.LossPolicyID中查找不同matched.LossPolicyID的匹配項。

  4. 更新tblLossClaims.PolicyReview相應。

主更新可以是這樣的:

UPDATE claims 
    SET PolicyReview = 'Y' 
    FROM tblLossClaims claims 
    JOIN (
     SELECT DISTINCT unrolled.LossPolicyID 
     FROM (
       SELECT LossPolicyID, Item = itemof(LossPolicyID) 
       FROM unrolling_join 
      ) unrolled 
     JOIN tblAutoPolicyList 
      ON unrolled.ID = tblAutoPolicyList.PolicyIDList 
     ) matched 
    ON matched.LossPolicyID = claims.LossPolicyID 

你可以把固定項目寬度和固定列表格式的優勢,因此很容易沒有UDF分裂LossPolicyID。我可以看到這個用數字表和SUBSTRING()的幫助下完成。 unrolling_join在上面的查詢實際上tblLossClaims接合用數字表。

這裏的「在放大」了的unrolled定義:

... 
(
SELECT LossPolicyID, 
     Item = SUBSTRING(LossPolicyID, 
         (v.number - 1) * @ItemLength + 1, 
         @ItemLength) 
    FROM tblLossClaims c 
    JOIN master..spt_values v ON v.type = 'P' 
    AND v.number BETWEEN 1 AND (LEN(c.LossPolicyID) + 2)/(@ItemLength + 2) 
) unrolled 
... 

master..spt_values是這裏用作數字表系統表。過濾v.type = 'P'讓我們用數字值的行集從0到2047,這是在LossPolicyID縮小到號碼列表從1到項目的數量。最終v.number可用作數組索引,並用於刪除單個項目。

@ItemLength當然只是LEN(tblAutoPolicyList.PolicyIDList)的。我可能也會聲明@ItemLength2 = @ItemLength + 2,所以在每次應用過濾器時都不會計算它。

基本上,就是這樣,如果我沒有錯過任何東西。

2

選擇LossPolicyID,*從表名,其中CHARINDEX( '策略ID',LossPolicyID,1)> 0