SQL Server 2019中JSON转SQL表行数异常问题求助
解决JSON数组转SQL表时的笛卡尔积问题
你当前的代码对每个JSON数组单独执行CROSS APPLY,导致多个数组的元素产生笛卡尔积,最终得到3×3×3×3=81行重复数据。要实现按数组索引对应取值,需要借助OPENJSON返回的key(即数组的索引位置)来关联各数组的元素。
修正后的代码
DECLARE @result NVARCHAR(MAX) = N'{"foo": [101, 202, 303], "bar": [1,2,3], "test": [10,20,30], "input": [100,200,300]}' SELECT f.value AS foo, b.value AS bar, t.value AS test, i.value AS input FROM OPENJSON(@result, '$.foo') WITH (value INT '$', idx INT '$.key') AS f JOIN OPENJSON(@result, '$.bar') WITH (value INT '$', idx INT '$.key') AS b ON f.idx = b.idx JOIN OPENJSON(@result, '$.test') WITH (value INT '$', idx INT '$.key') AS t ON f.idx = t.idx JOIN OPENJSON(@result, '$.input') WITH (value INT '$', idx INT '$.key') AS i ON f.idx = i.idx
预期结果
| foo | bar | test | input |
|---|---|---|---|
| 101 | 1 | 10 | 100 |
| 202 | 2 | 20 | 200 |
| 303 | 3 | 30 | 300 |
代码说明
OPENJSON解析数组时,会返回每个元素的key(数组的索引,从0开始)和value(元素值)- 通过
JOIN条件匹配各个数组的索引,确保同一位置的元素被组合成一行,避免笛卡尔积
内容的提问来源于stack exchange,提问作者ChiragM
相关产品推荐
相关产品推荐

