联接表到带有数组字段的json中

时间:2019-04-01 12:10:42

标签: javascript sql node.js sql-server

我有两个要联接的SQL表-一个对多关系。我的一个node.JS服务器正在请求查询,我需要将该信息解析为JSON,对于每一个重复的行,我都需要插入数据排列成一个数组。或者,如果对解决方案更方便,只要我得到所需的JSON,我也可以不使用联接分别查询表。

我从未真正尝试过任何事情,因为我不知道从哪里开始,我想到了map或reduce函数,这些函数可能会有所帮助,但map将相同数量的对象返回到数组并将reduce减少为一个...

让我们说第一个表是一个Person表,并给我一个json像这样:

[
{id:1,name:dani},
{id:2,name:dana},
{id:3,name:dan},
]

第二个表具有该人ID和与该所有者有关的狗的外键:

[
{onwerId:1,dogName:Blacky},
{onwerId:1,dogName:Whitey},
{onwerId:2,dogName:Greeny},
]

如果我请求将左表连接在一起(不需要重复的onwerId和id),我可以得到:

[
{id:1,name:dani,dogName:Blacky},
{id:1,name:dani,dogName:Whitey},
{id:2,name:dana,dogName:Greeny},
{id:3,name:dan,dogName:NULL},
]

问题是我不希望丹妮出现两次。 我想为每个相同的人id制作一个狗数组,以便结果显示如下:

[
{id:1,name:dani,dogs:[{dogName:Blacky},{dogName:Whitey}]},
{id:2,name:dana,dogs:[{dogName:Greeny}]},
{id:3,name:dan,dogs:[]}
]

对于示例中的人员ID 3,我不介意它为NULL而不是空数组。

1 个答案:

答案 0 :(得分:0)

所以你可以做这样的事情

我创建了两个临时表来模拟类似于测试数据的东西

SELECT 1 Id, 'Dani' Name
INTO #Person
UNION
SELECT 2, 'Dana'
UNION
SELECT 3, 'Dan'

SELECT 1 OwnerId, 'Blacky' DogName
INTO #Dog
UNION
SELECT 1, 'Whitey'
UNION
SELECT 2, 'Greeny'

然后创建一个CTE,将狗的名字串联成一个字符串

;WITH DogGroup AS
(
    --Build dog strings
    SELECT OwnerId, STUFF((
                SELECT ',' + DogName
                FROM #Dog D2
                WHERE D2.OwnerId = D.OwnerId
                FOR XML PATH('')
                ), 1, 1, '') Names
    FROM #Dog D
    GROUP BY
        OwnerId
)
SELECT
    P.Id, P.Name, D.Names
FROM 
    #Person P
JOIN 
    DogGroup D ON P.Id = D.OwnerId

给你这个结果

Id  Name    Names
1   Dani    Blacky,Whitey
2   Dana    Greeny