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

如何编写SQL查询生成含item与sub数组的指定嵌套JSON结构?

生成指定嵌套JSON结构的SQL解决方案

我来帮你搞定这个问题!你想要的是将一对多关联的两张表数据,转换成外层为数组、每个元素包含item嵌套对象的JSON格式,之前的查询没能正确构建层级结构,下面是可行的解决方法:

问题分析

你的原查询用了FOR JSON PATH, root('item'),但这个写法会把所有结果打包进一个item根对象里,而不是每个主表记录对应一个独立的item对象并组成数组,同时也没正确生成sub嵌套数组。

正确的SQL查询

DECLARE @T1 TABLE(RootId int, [Name] varchar(50))
DECLARE @T2 TABLE(Id int,RootId int, Category varchar(50))
INSERT INTO @T1 VALUES(1,'Some Name 12121'),(2,'Some Name 343434')
INSERT INTO @T2 VALUES(100,1,'Category 3333'), (101,1,'Category 2222'), (102,1,'Category 4444'), (103,1,'Category 5555'), (104,2,'Category 1111'), (105,2,'Category 77777')

SELECT
  (
    SELECT
      T1.RootId AS rootId,
      T1.Name AS name,
      (
        -- 子查询生成对应主记录的sub数组
        SELECT Id, Category
        FROM @T2 T2
        WHERE T2.RootId = T1.RootId
        FOR JSON PATH
      ) AS sub
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER -- 去掉内层数组包装,转为单个对象
  ) AS item
FROM @T1 T1
FOR JSON PATH; -- 外层生成包含所有item对象的数组

结果说明

执行后会生成完全符合你需求的JSON:

[
  {
    "item": {
      "rootId": 1,
      "name": "Some Name 12121",
      "sub": [
        {"id":100,"category":"Category 3333"},
        {"id":101,"category":"Category 2222"},
        {"id":102,"category":"Category 4444"},
        {"id":103,"category":"Category 5555"}
      ]
    }
  },
  {
    "item": {
      "rootId": 2,
      "name": "Some Name 343434",
      "sub": [
        {"id":104,"category":"Category 1111"},
        {"id":105,"category":"Category 77777"}
      ]
    }
  }
]

如果只需要生成RootId=1的记录,只需在主查询末尾添加WHERE T1.RootId = 1即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:43:15