4

我有类似于下面的表格,其中有一对多映射

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')

我期待编写查询,以便生成以下格式的 json,其中包含子项和数组

    [
  {
    "item": {
      "rootId": 1,
      "name": "Some Name 12121",
      "sub": [
        {
          "id": 100,
          "category": "Category 3333"
        },
        {
          "id": 101,
          "category": "Category 2222"
        }
      ]
    }
  }
]

我在下面尝试过,但无法达到预期的输出

SELECT T1.RootId,T1.Name,T2.Id AS [Sub.Id],T2.Category as [Sub.Category]
FROM @T1 T1
    INNER JOIN @T2 T2 ON T1.RootId = T2.RootId
FOR JSON PATH, root('item')

有没有办法查询,以便它产生预期的 Json

4

1 回答 1

5

您需要做的就是(微不足道地)正确地为您的表命名,然后使用AUTO而不是PATH

SELECT T1.RootId,T1.Name,sub.Id AS Id,sub.Category as Category
FROM @T1 T1
    INNER JOIN @T2 sub ON T1.RootId = sub.RootId
FOR JSON AUTO, ROOT('item');

哪些输出(应用格式修饰符后):

{
    "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"
                }
            ]
        },
        {
            "RootId": 2,
            "Name": "Some Name 343434",
            "sub": [
                {
                    "Id": 104,
                    "Category": "Category 1111"
                },
                {
                    "Id": 105,
                    "Category": "Category 77777"
                }
            ]
        }
    ]
}
于 2020-09-29T12:30:36.833 回答