请记住我使用的是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。
答案 0 :(得分:2)
从tableName中选择LossPolicyID,*,其中charindex('PolicyID',LossPolicyID,1)> 0
答案 1 :(得分:1)
基本上,这个想法是这样的:
'展开'tblLossClaims
并返回两列:tblLossClaims
键(您没有提及任何内容,所以我猜它会是LossPolicyID
)和{{ 1}} =来自Item
的单个项目。
在LossPolicyID
中找到unrolled.Item
的匹配项。
在tblAutoPolicyList.PolicyIDList
中查找不同matched.LossPolicyID
的匹配项。
相应地更新tblLossClaims.LossPolicyID
。
主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)。
根据表/数据的大小,您可能希望为临时表添加索引。