(Microsoft SQL)如何将其层次相关的子项目作为JSON值获得项目?

发布于 2025-02-13 21:29:24 字数 1409 浏览 0 评论 0原文

我有一张桌子,

CREATE TABLE dbo.items (
    item_id INT PRIMARY KEY,
    name VARCHAR,
);

然后有一个桌子,套件,其中显示了哪些项目是子项目。

CREATE TABLE dbo.kits (
    parent_item_id INT
    child_item_id INT
);
INSERT INTO items (id, name)
VALUES 
(1, "Rainy day kit"),
(2, "Beach day kit"),
(3, "Umbrella"),
(4, "Jacket"),
(5, "Swimsuit"),
(6, "Sunscreen"),
(7, "Rainy Beach day kit")
INSERT INTO kits (parent_item_id, child_item_id)
VALUES 
(1, 3),
(1, 4),
(2, 5),
(2, 6),
(7, 1),
(7, 2);

我想和他们的孩子以JSON格式获得一些物品。此查询非常适合将其儿童物品获取物品,

SELECT i.item_id, i.name, 
   (SELECT i2.item_id, i2.name 
    FROM items i2 
    INNER JOIN kits k on k.child_item_id = i2.item_id
    WHERE k.parent_item_id = i.item_id
    FOR JSON PATH
    )
FROM items i
WHERE i.item_id = 1

item_id, name, kit_children
1, "Rainy day kit", [{"item_id":3, "name":"Umbrella"},{"item_id":4, "name":"Jacket"}]

但是如果我想递归地进行更深入的研究,这将行不通。有人知道一种递归获取儿​​童物品的方法吗? 这样的查询可以返回这样的结果:

item_id, name, kit_children
7, "Rainy Beach day kit", [{"item_id":1, "name":"Rainy day kit", "kit_children":[{"item_id":3, "name":"Umbrella"},{"item_id":4, "name":"Jacket"}]}, {"item_id":2, "name":"Beach day kit", "kit_children":[{"item_id":5, "name":"Swimsuit"},{"item_id":6, "name":"Sunscreen"}]}]

I have a table, items

CREATE TABLE dbo.items (
    item_id INT PRIMARY KEY,
    name VARCHAR,
);

I then have a table, kits, which shows which items are child items.

CREATE TABLE dbo.kits (
    parent_item_id INT
    child_item_id INT
);
INSERT INTO items (id, name)
VALUES 
(1, "Rainy day kit"),
(2, "Beach day kit"),
(3, "Umbrella"),
(4, "Jacket"),
(5, "Swimsuit"),
(6, "Sunscreen"),
(7, "Rainy Beach day kit")
INSERT INTO kits (parent_item_id, child_item_id)
VALUES 
(1, 3),
(1, 4),
(2, 5),
(2, 6),
(7, 1),
(7, 2);

I want to get a few items, with their children in json format. This query works great for getting an item with its child items

SELECT i.item_id, i.name, 
   (SELECT i2.item_id, i2.name 
    FROM items i2 
    INNER JOIN kits k on k.child_item_id = i2.item_id
    WHERE k.parent_item_id = i.item_id
    FOR JSON PATH
    )
FROM items i
WHERE i.item_id = 1

item_id, name, kit_children
1, "Rainy day kit", [{"item_id":3, "name":"Umbrella"},{"item_id":4, "name":"Jacket"}]

But if I want to recursively go deeper, this won't work. Does anyone know of a way to recursively get child items?
Such a query could return a result like this:

item_id, name, kit_children
7, "Rainy Beach day kit", [{"item_id":1, "name":"Rainy day kit", "kit_children":[{"item_id":3, "name":"Umbrella"},{"item_id":4, "name":"Jacket"}]}, {"item_id":2, "name":"Beach day kit", "kit_children":[{"item_id":5, "name":"Swimsuit"},{"item_id":6, "name":"Sunscreen"}]}]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文