如何在多行上使用 OPENJSON
How to use OPENJSON on multiple rows
我有一个临时文件 table,里面有多行,每一行都有一个名为 Categories
的列;其中包含一个非常简单的 json 数组 ids
,用于不同 table 中的类别。
临时文件的一些示例行 table:
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
现在我想做的是 select 临时 table.
中所有行的所有类别 ID
我所拥有的是以下内容,但它无法正常工作,因为它给我以下错误:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
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
我想这是有道理的,因为我正在 select 处理多行并且需要解析每一行各自的类别 ID json。我只是不确定要 do/change 什么才能给我想要的结果。预先感谢您的帮助。
您需要像这样使用 CROSS APPLY:
SELECT id ,
name ,
t.Value AS category_id
FROM #temp
CROSS APPLY OPENJSON(categories, '$') t;
然后,您可以使用 category_id
列加入您的 Categories
table,如下所示:
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
我有一个临时文件 table,里面有多行,每一行都有一个名为 Categories
的列;其中包含一个非常简单的 json 数组 ids
,用于不同 table 中的类别。
临时文件的一些示例行 table:
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
现在我想做的是 select 临时 table.
中所有行的所有类别 ID我所拥有的是以下内容,但它无法正常工作,因为它给我以下错误:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
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
我想这是有道理的,因为我正在 select 处理多行并且需要解析每一行各自的类别 ID json。我只是不确定要 do/change 什么才能给我想要的结果。预先感谢您的帮助。
您需要像这样使用 CROSS APPLY:
SELECT id ,
name ,
t.Value AS category_id
FROM #temp
CROSS APPLY OPENJSON(categories, '$') t;
然后,您可以使用 category_id
列加入您的 Categories
table,如下所示:
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