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

如何遍历发票查询结果并执行子查询生成嵌套式输出?

实现发票主记录与行项目的合并输出

根据你的需求,有两种常见的SQL实现方式,分别对应不同的输出格式场景:

方法1:关联后重复显示发票主信息

如果允许每条行项目都携带发票的主信息(日期、总额),直接通过INNER JOIN关联两张表,再按发票号排序即可保证同一张发票的所有记录排在一起:

SELECT 
    ii.Invoice_Number,
    ii.Date,
    ii.Total,
    ili.Item_Number,
    ili.Description,
    ili.Unit_Price,
    ili.Quantity
FROM Invoice_Info ii
INNER JOIN [Invoice Line Items] ili
    ON ii.Invoice_Number = ili.Invoice_Number
ORDER BY ii.Invoice_Number;

注:表名包含空格时,SQL Server用方括号[]包裹,MySQL用反引号`包裹,根据你的数据库调整语法。

方法2:发票主记录仅显示一次,紧跟行项目

如果需要发票主信息只输出一次,后续直接列出对应行项目(行项目字段为空的行对应发票主记录),可以用UNION ALL合并两个结果集,搭配排序标识控制顺序:

SELECT 
    Invoice_Number,
    Date,
    Total,
    Item_Number,
    Description,
    Unit_Price,
    Quantity
FROM (
    -- 输出发票主记录,排序标识设为1(确保排在前面)
    SELECT 
        Invoice_Number,
        Date,
        Total,
        NULL AS Item_Number,
        NULL AS Description,
        NULL AS Unit_Price,
        NULL AS Quantity,
        1 AS Sort_Order
    FROM Invoice_Info

    UNION ALL

    -- 输出对应行项目,排序标识设为2
    SELECT 
        ii.Invoice_Number,
        ii.Date,
        ii.Total,
        ili.Item_Number,
        ili.Description,
        ili.Unit_Price,
        ili.Quantity,
        2 AS Sort_Order
    FROM Invoice_Info ii
    INNER JOIN [Invoice Line Items] ili
        ON ii.Invoice_Number = ili.Invoice_Number
) AS CombinedData
ORDER BY Invoice_Number, Sort_Order;

输出效果示例:

INV-001 | 2024-05-20 | 150.00 | NULL | NULL | NULL | NULL
INV-001 | 2024-05-20 | 150.00 | ITEM-001 | 键盘 | 50.00 | 2
INV-001 | 2024-05-20 | 150.00 | ITEM-002 | 鼠标 | 50.00 | 1
INV-002 | 2024-05-21 | 80.00 | NULL | NULL | NULL | NULL
INV-002 | 2024-05-21 | 80.00 | ITEM-003 | 耳机 | 80.00 | 1

补充说明

  • 若要包含没有行项目的发票,将INNER JOIN替换为LEFT JOIN即可。
  • 排序标识Sort_Order仅用于内部排序,最终结果不会显示该字段。

内容的提问来源于stack exchange,提问作者SuperSix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 18:43:30