Как использовать OPENJSON на нескольких строках - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть временная таблица с несколькими строками, и в каждой строке есть столбец с именем Categories;который содержит очень простой массив json ids для категорий в другой таблице.

Несколько примеров строк временной таблицы:

Id                                      Name    Categories
---------------------------------------------------------------------------------------------
'539f7e28-143e-41bb-8814-a7b93b846007'  Test 1  ["category1Id", "category2Id", "category3Id"]
'f29e2ecf-6e37-4aa9-aa56-4a351d298bfc'  Test 2  ["category1Id", "category2Id"]
'34e41a0a-ad92-4cd7-bf5c-8df6bfd6ed5c'  Test 3  NULL

Теперь я хотел бы выбрать все идентификаторы категории из всех строк в временной таблице.

У меня есть следующее, и оно не работает, так как выдает ошибку:

Подзапрос вернул более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

SELECT
     c.Id
    ,c.[Name]
    ,c.Color
FROM
    dbo.Category as c
WHERE
    c.Id in (SELECT [value] FROM OPENJSON((SELECT Categories FROM #TempTable)))
and c.IsDeleted = 0

Что, я думаю, имеет смыслэто терпит неудачу, потому что я выбираю несколько строк, и мне нужно проанализировать соответствующие идентификаторы каждой строки json. Я просто не уверен, что делать / менять, чтобы дать мне результаты, которые я хочу. Заранее благодарю за любую помощь.

1 Ответ

1 голос
/ 08 ноября 2019

Вам необходимо использовать CROSS APPLY следующим образом:

SELECT id ,
       name ,
       t.Value AS category_id
FROM   #temp
       CROSS APPLY OPENJSON(categories, '$') t;

И затем вы можете присоединиться к таблице Categories, используя столбец category_id, что-то вроде этого:

SELECT id ,
       name ,
       t.Value AS category_id,
       c.*
FROM   #temp
       CROSS APPLY OPENJSON(categories, '$') t
       LEFT JOIN Categories c ON c.Id = t.Value
...