我有两个要联接的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而不是空数组。
答案 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