You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL WHILE循环按顺序遍历4张关联业务表输出指定结果

需求实现指引

业务表结构及数据示例

1. policy表

policy numberrecord layout
Abcpolr
Efgpolr

2. coverage表

Policy numberrecord layout
Abcprop
Abc
Efgprop

3. vehicle表

Policy numberrecord layoutvin number
Abcprp1123
Abcprp1123
EfgPrp1456

4. driver表

Policy numberrecord layoutvin number
Abcsubj123
Abcsubj123
Efgsubj456

需求说明

需按先policy记录→关联coverage记录→关联vehicle记录→关联driver记录的顺序遍历所有表,使用SQL WHILE循环实现该逻辑,最终输出格式如下:

期望输出

Policy NumberRecord LayoutVIn number
Abcpolrnull
Abcpropnull
Abcprp1123
Abcsubj123
Abcsubj123
Efgpolrnull
Efgpropnull
Efgprp1456
Efgsubj456

实现指引

思路概述

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 03:39:58