帮助复杂的连接查询

时间:2011-02-03 17:38:51

标签: sql-server-2000

请记住我使用的是SQL 2000

我有两张桌子。

tblAutoPolicyList包含一个名为PolicyIDList的字段。

tblLossClaims包含两个名为LossPolicyID&的字段PolicyReview

我正在编写一个存储过程,它将从PolicyID字段获取不同的PolicyIDList,并循环遍历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。

3 个答案:

答案 0 :(得分:2)

从tableName中选择LossPolicyID,*,其中charindex('PolicyID',LossPolicyID,1)> 0

答案 1 :(得分:1)

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

  1. '展开'tblLossClaims并返回两列:tblLossClaims键(您没有提及任何内容,所以我猜它会是LossPolicyID)和{{ 1}} =来自Item的单个项目。

  2. LossPolicyID中找到unrolled.Item的匹配项。

  3. tblAutoPolicyList.PolicyIDList中查找不同matched.LossPolicyID的匹配项。

  4. 相应地更新tblLossClaims.LossPolicyID

  5. 主UPDATE可能如下所示:

    tblLossClaims.PolicyReview

    您可以利用固定项目宽度和固定列表格式,从而轻松地在没有UDF的情况下拆分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 。我可以在数字表和LossPolicyID的帮助下看到这一点。上述查询中的SUBSTRING()实际上是unrolling_join与数字表连接。

    以下是tblLossClaims'放大'的定义:

    unrolled

    master..spt_values是一个系统表,在此用作数字表。过滤器... ( 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 ... 为我们提供了一个数字值从0到2047的行集,该行集缩小为从1到v.type = 'P'中的项目数的列表。最终LossPolicyID用作数组索引,用于剪切单个项目。

    @ItemLength当然只是v.number。我可能也会声明LEN(tblAutoPolicyList.PolicyIDList),因此每次应用过滤器时都不会计算它。

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

答案 2 :(得分:0)

如果PolicyIDList字段是分隔列表,则必须先分离各个策略ID并创建包含所有结果的临时表。接下来,在tblLossClaims上使用更新查询,其中'where exists(select * from #temptable tt where tt.PolicyID = LossPolicyID)。

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