导入Fitbit JSON文件时如何用OUTER APPLY获取全量唯一键名
场景1:仅提取JSON一级键的唯一集合
直接对L2.[key]加DISTINCT去重即可,代码如下:
SELECT DISTINCT L2.[key] AS unique_top_key FROM OPENJSON(@json,'$') AS L1 OUTER APPLY OPENJSON(L1.[value]) AS L2 ORDER BY L2.[key]
这个方案可以直接解决你当前的问题,输出所有顶层活动属性的唯一键,不会重复出现不同记录共有的键。
场景2:提取包含嵌套对象在内的全量唯一键
如果你还需要拿到manualValuesSpecified、source这类嵌套对象内部的子键,用递归CTE处理即可:
WITH RecursiveJsonKeys AS ( -- 第一层:提取数组内所有对象的顶层键 SELECT L2.[key] AS full_key_path, L2.[value] AS node_value, L2.[type] AS node_type FROM OPENJSON(@json, '$') L1 OUTER APPLY OPENJSON(L1.[value]) L2 UNION ALL -- 递归层:如果当前节点是JSON对象,继续提取内部键 SELECT R.full_key_path + '.' + CHILD.[key] AS full_key_path, CHILD.[value] AS node_value, CHILD.[type] AS node_type FROM RecursiveJsonKeys R CROSS APPLY OPENJSON(R.node_value) CHILD WHERE R.node_type = 5 -- OPENJSON返回的type=5代表值为JSON对象 ) -- 去重输出全量唯一键 SELECT DISTINCT full_key_path FROM RecursiveJsonKeys ORDER BY full_key_path
执行后会输出类似manualValuesSpecified.calories、source.id这类完整键路径,方便你后续在WITH子句中定义所有需要提取的字段。
内容的提问来源于stack exchange,提问作者NamedArray
相关产品推荐
相关产品推荐

