帮助一个复杂的连接查询

问题描述:

请记住我使用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

如果PolicyIDList字段是一个分隔的列表,你必须先分开个别政策ID和创建临时表与所有的结果。接下来,在与tblLossClaims使用更新查询“,其中存在(来自#temptable TT其中tt.PolicyID = LossPolicyID选择*)。

根据表/数据的大小,您可能希望将索引添加到临时表中。

基本上,这个想法是这样的:

  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,所以在每次应用过滤器时都不会计算它。

基本上,就是这样,如果我没有错过任何东西。

选择LossPolicyID,*从表名,其中CHARINDEX( '策略ID',LossPolicyID,1)> 0