You need to enable JavaScript to run this app. SQL Server关联两表返回无冗余非表格格式数据的实现方案
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server关联两表返回无冗余非表格格式数据的实现方案

关联两张表避免字段冗余的单次查询实现方案

方案1:JSON/XML聚合(主流数据库优先推荐)

目前MySQL 5.7+、PostgreSQL 9.4+、SQL Server 2016+等主流数据库都支持原生的JSON聚合函数,可以直接在SQL层组装成你需要的嵌套结构,一次查询返回结果,完全没有Name、Description字段的冗余传输。
假设你的两张表分别为items(存物料基础信息)、item_batches(存批次库存信息),各数据库的参考写法如下:

MySQL示例

SELECT 
  i.Id,
  i.Name,
  i.Description,
  JSON_ARRAYAGG(
    JSON_OBJECT(
      'Batch', b.Batch,
      'Quantity', b.Quantity
    )
  ) AS Quantities
FROM items i
LEFT JOIN item_batches b ON i.Id = b.Id
GROUP BY i.Id, i.Name, i.Description;

返回结果中每个物料Id仅对应一行,Quantities字段为该物料所有批次的JSON数组,应用层直接反序列化即可得到你需要的Item对象结构。

PostgreSQL示例

SELECT 
  i.Id,
  i.Name,
  i.Description,
  json_agg(
    json_build_object(
      'Batch', b.Batch,
      'Quantity', b.Quantity
    )
  ) AS Quantities
FROM items i
LEFT JOIN item_batches b ON i.Id = b.Id
GROUP BY i.Id, i.Name, i.Description;

SQL Server示例

SELECT 
  i.Id,
  i.Name,
  i.Description,
  (
    SELECT Batch, Quantity 
    FROM item_batches b 
    WHERE b.Id = i.Id 
    FOR JSON PATH
  ) AS Quantities
FROM items i
FOR JSON PATH, ROOT('Items')

该写法可以直接返回完整的嵌套JSON结构,外层自动包含Items根节点,应用层无需额外组装直接解析即可。

方案2:排序后单次查询(兼容老版本数据库)

如果你使用的数据库不支持JSON聚合,可以用排序+单次关联查询的方案,仅需要一次数据库调用,应用层处理逻辑非常简单:

SELECT 
  i.Id,
  i.Name,
  i.Description,
  b.Batch,
  b.Quantity
FROM items i
LEFT JOIN item_batches b ON i.Id = b.Id
ORDER BY i.Id;

应用层遍历结果时,仅需要判断当前行的Id是否和上一行一致:

  • 一致则将当前批次信息追加到当前Item的Quantities列表
  • 不一致则新建Item对象存储当前物料的基础信息和批次
    该方案比两次分别查询再映射的逻辑简单很多,代码复杂度极低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 16:45:02