我有一个表格,是这样的:
| f1 [int] | f2 [int] | jo1 [json object] | ja [json array] |
ja 是一个由多个 JSON 对象组成的数组,结构如下:
[
{
"ja_f1": x [int],
"ja_f2": y [float]
},
...
]
为了简单起见,我们假设 jo1 的结构也类似于 ja 中的对象
如何将其平展为单个记录?我正在尝试使它成为:
| f1 | f2 | jo1_f1 | jo1_f2 | ja[0]ja_f1 | ja[0]ja_f2 | ... | ja[n]ja_f2 |
我一直在 OPENJSON 上使用带有 CROSS APPLY 的光标来恢复丢失的数据,但它将其分解为多个部分,这不是我真正需要的。这是它的样子:
DECLARE @CursorForJSON CURSOR;
声明@JSON nvarchar(MAX);开始 设置 @CursorForJSON = 光标 选择JSON_Query(ja) 从我的表
OPEN @CursorForJSON
FETCH NEXT FROM @CursorForJSON
INTO @JSON
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT mt.f1 AS 'f1',
ja_f1,
ja_f2
FROM OPENJSON( @json )
WITH ( ja_f1 INT '$.ja_f1',
ja_f2 FLOAT '$.ja_f2')
CROSS APPLY mytable as mt
GROUP BY mt.f1, ja_f1, ja_f2
ORDER BY mt.f1 ASC;
FETCH NEXT FROM @CursorForJSON
INTO @JSON
END;
CLOSE @CursorForJSON ;
DEALLOCATE @CursorForJSON;
END;
任何指导将不胜感激
编辑:修复了伪代码中的一些错误
我从错误的角度处理这个问题,这就是我想做的......
SELECT mt.f1 AS 'f1',
mt.f2 AS 'f2',
JSON_VALUE(mt.jo1_f1,'$.jo_f1') AS 'jo f1',
JSON_VALUE(mt.jo1_f2,'$.jo_f2') AS 'jo f2',
j.ja_f1,
j.ja_f2
FROM mytable mt
CROSS APPLY OPENJSON( mt.ja ) WITH (
ja_f1 INT '$.ja_f1',
ja_f2 FLOAT '$.ja_f2'
) j
GROUP BY mt.f1, mt.jo1_f1, mt.jo1_f2, j.ja_f1, j.ja_f2
ORDER BY mt.f1 ASC;