如何遍历发票查询结果并执行子查询生成嵌套式输出?
实现发票主记录与行项目的合并输出
根据你的需求,有两种常见的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
相关产品推荐
相关产品推荐

