帮助一个复杂的连接查询
请记住我使用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
如果PolicyIDList字段是一个分隔的列表,你必须先分开个别政策ID和创建临时表与所有的结果。接下来,在与tblLossClaims使用更新查询“,其中存在(来自#temptable TT其中tt.PolicyID = LossPolicyID选择*)。
根据表/数据的大小,您可能希望将索引添加到临时表中。
基本上,这个想法是这样的:
“展开”
tblLossClaims
和返回两个列:tblLossClaims
键(你没有提到任何,所以我想这将是LossPolicyID
)和Item
=从LossPolicyID
单个项目。查找
tblAutoPolicyList.PolicyIDList
的unrolled.Item
的匹配项。在
tblLossClaims.LossPolicyID
中查找不同matched.LossPolicyID
的匹配项。更新
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
所以你正在编写一个存储过程来反规范化的数据模型? – diagonalbatman 2011-02-03 17:42:20
PolicyIDList字段是带有分隔的策略ID列表的单个字段吗? (AAAA BBBB CCCC或AAAA,BBBB,CCCC)? – jbehren 2011-02-03 17:47:56