Объединенная таблица в json с полем массива - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть две таблицы SQL, к которым я присоединяюсь - одна ко многим отношениям. Запрос запрашивается моим сервером node.JS, и мне нужно проанализировать эту информацию в JSON, который для каждой повторяющейся строки мне нужно вставить данные в массив. или же я мог бы запросить таблицы отдельно без объединения, если это более удобно для решения, если я получаю JSON, который мне нужен.

Я еще никогда ничего не пробовал, потому что я не знаю, с чего начать, я думал о map или уменьшении функций, которые могли бы помочь, но map возвращает то же количество объектов в массив, а при уменьшении уменьшает их до одного ...

Допустим, первая таблица является таблицей Person и дает мне json примерно так:

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

, а во второй таблице есть внешний ключ для этого человека и собака, связанная с этим владельцем:

[
{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:1,name:dani,dogs:[{dogName:Blacky},{dogName:Whitey}]},
{id:2,name:dana,dogs:[{dogName:Greeny}]},
{id:3,name:dan,dogs:[]}
]

что касается лица с идентификатором 3 в примере - я не против, чтобы оно было NULL вместо пустого массива.

1 Ответ

0 голосов
/ 01 апреля 2019

Так что вы могли бы сделать что-то вроде этого

Я создал две временные таблицы для макета чего-то похожего на ваши тестовые данные

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...