如何用SQL WHILE循环按顺序遍历4张关联业务表输出指定结果
需求实现指引
业务表结构及数据示例
1. policy表
| policy number | record layout |
|---|---|
| Abc | polr |
| Efg | polr |
2. coverage表
| Policy number | record layout |
|---|---|
| Abc | prop |
| Abc | |
| Efg | prop |
3. vehicle表
| Policy number | record layout | vin number |
|---|---|---|
| Abc | prp1 | 123 |
| Abc | prp1 | 123 |
| Efg | Prp1 | 456 |
4. driver表
| Policy number | record layout | vin number |
|---|---|---|
| Abc | subj | 123 |
| Abc | subj | 123 |
| Efg | subj | 456 |
需求说明
需按先policy记录→关联coverage记录→关联vehicle记录→关联driver记录的顺序遍历所有表,使用SQL WHILE循环实现该逻辑,最终输出格式如下:
期望输出
| Policy Number | Record Layout | VIn number |
|---|---|---|
| Abc | polr | null |
| Abc | prop | null |
| Abc | prp1 | 123 |
| Abc | subj | 123 |
| Abc | subj | 123 |
| Efg | polr | null |
| Efg | prop | null |
| Efg | prp1 | 456 |
| Efg | subj | 456 |
实现指引
思路概述
通过WHILE循环逐个处理每个唯一保单号,按指定顺序输出该保单对应的四类记录,同时过滤coverage表中record layout为空的无效条目,确保输出匹配预期格式。
具体实现代码(以SQL Server为例)
-- 1. 创建临时表存储最终输出结果 CREATE TABLE #FinalResult ( PolicyNumber VARCHAR(50), RecordLayout VARCHAR(50), VINNumber VARCHAR(50) ) -- 2. 提取所有唯一保单号,生成待处理清单 DECLARE @PolicyList TABLE ( PolicyNumber VARCHAR(50), IsProcessed BIT DEFAULT 0 ) INSERT INTO @PolicyList (PolicyNumber) SELECT DISTINCT [policy number] FROM policy -- 3. 初始化循环变量 DECLARE @CurrentPolicy VARCHAR(50) SELECT TOP 1 @CurrentPolicy = PolicyNumber FROM @PolicyList WHERE IsProcessed = 0 -- 4. 启动WHILE循环处理每个保单 WHILE @CurrentPolicy IS NOT NULL BEGIN -- 插入当前保单的policy记录 INSERT INTO #FinalResult SELECT [policy number], [record layout], NULL FROM policy WHERE [policy number] = @CurrentPolicy -- 插入当前保单的有效coverage记录(过滤空布局值) INSERT INTO #FinalResult SELECT [Policy number], [record layout], NULL FROM coverage WHERE [Policy number] = @CurrentPolicy AND [record layout] IS NOT NULL AND [record layout] <> '' -- 插入当前保单的vehicle记录(统一布局值为小写) INSERT INTO #FinalResult SELECT [Policy number], LOWER([record layout]), [vin number] FROM vehicle WHERE [Policy number] = @CurrentPolicy -- 插入当前保单的driver记录 INSERT INTO #FinalResult SELECT [Policy number], [record layout], [vin number] FROM driver WHERE [Policy number] = @CurrentPolicy -- 标记当前保单为已处理 UPDATE @PolicyList SET IsProcessed = 1 WHERE PolicyNumber = @CurrentPolicy -- 获取下一个待处理保单 SET @CurrentPolicy = NULL SELECT TOP 1 @CurrentPolicy = PolicyNumber FROM @PolicyList WHERE IsProcessed = 0 END -- 查询并输出最终结果 SELECT PolicyNumber AS [Policy Number], RecordLayout AS [Record Layout], VINNumber AS [VIn number] FROM #FinalResult -- 清理临时表 DROP TABLE #FinalResult
代码说明
#FinalResult临时表用于统一存储所有按顺序生成的记录;@PolicyList临时表存储唯一保单号,避免重复处理同一保单;- 循环内严格按照需求顺序插入四类记录,针对coverage表过滤无效空值,vehicle表统一
record layout大小写以匹配预期输出; - 每处理完一个保单就标记为已处理,直到所有保单处理完成。
内容的提问来源于stack exchange,提问作者Sujatha
相关产品推荐
相关产品推荐

