sql - 在 SQL 中的 JSON 中创建 JSON 数组
问题描述
我有如下 2 个表,我目前正在编写一个基于这些表返回 JSON 的函数。在查询此问题时需要帮助。
TABLE1
Id ReqMode RespMode Count TabName
1001 R T 5000 TAB3
1002 R Y 10000 TAB4
1003 R T 3000 TAB6
1004 R T 5000 TAB5
1005 R Y 6000 TAB2
TABLE2
TabName CMeth CDate UMeth UDate DMeth DDate ParentTab
TAB1 F A1 F L1 C
TAB2 P C C TAB1
TAB3 P C C TAB2
TAB4 F B5 C C
TAB5 P C C TAB4
TAB6 C C C
JSON 格式:
{
"d":{
"Id":"1001",
"ReqMode":"R",
"RespMode":"T",
"Count":5000,
"TabName":"TAB3",
"DELTA":[
{
"Tabname":"TAB3",
"CMeth":"P",
"CDate":"",
"UMeth":"C",
"UDate":"",
"DMeth":"C",
"DDate":"",
"ParentTab":"TAB2"
},
{
"Tabname":"TAB2",
"CMeth":"P",
"CDate":"",
"UMeth":"C",
"UDate":"",
"DMeth":"C",
"DDate":"",
"ParentTab":"TAB1"
},
{
"Tabname":"TAB1",
"CMeth":"F",
"CDate":"A1",
"UMeth":"F",
"UDate":"L1",
"DMeth":"",
"DDate":"C",
"ParentTab":""
}
],
"MDATA":[ ]
}
}
解释:
如果我请求 'TAB3' ,那么我需要从 TABLE1 中提取一个 TabName 为 TAB3 的记录。根据这个表名,我在 TABLE2 中检查它的值。
我的方法有值 P(Parent),C(Change),F(Field)
在 JSON 的 DELTA 部分中获取 3 行背后的逻辑是:
对于 TabName TAB3,如果 P 存在于 TABLE2 中的任何方法中,则选择 ParentTab 值并将其与 TABLE2 中的 TabName 进行比较并获取其详细信息。这是一个递归循环,直到我们在任何方法中遇到 C 或 F。
我目前迷失在如何根据值创建递归循环。到目前为止我的查询:
select Id AS 'd.Id', ReqMode AS 'd.ReqMode' ,RespMode AS 'd.RespMode',Count AS 'd.Count',TabName AS 'd.TabName'
,JSON_QUERY('[]') 'd.DELTA',JSON_QUERY('[]') 'd.MDATA'
FROM TABLE1
FOR JSON PATH
在创建我的 JSON 的 DELTA 部分时需要帮助,这将取决于我作为输入传递给函数的 TabName。
提前致谢。
解决方案
这个答案有点晚了,但这应该会给你你正在寻找的东西。重要的是要注意递归 cte 的默认限制为 100,但您可以使用 MAXRECURSION 选项为您的情况配置合理的限制。
declare @id int = 1001
declare @tab varchar(100) = (select tabName from Table1 where id = @id);
with delta as (
select tabname,cmeth,isnull(cdate,'') as cdate
,umeth,isnull(udate,'') as udate
,dmeth,isnull(ddate,'') as ddate
,isnull(parenttab,'') as parenttab
from dbo.Table2
where tabname = @tab
union all
select t.tabname,t.cmeth,isnull(t.cdate,'') as cdate
,t.umeth,isnull(t.udate,'') as udate
,t.dmeth,isnull(t.ddate,'') as ddate
,isnull(t.parenttab,'') as parenttab
from dbo.Table2 t
inner join delta d on t.tabname = d.parenttab
)
SELECT ID as 'd.id'
,ReqMode as 'd.reqmode'
,RespMode as 'd.respmode'
,[Count] as 'd.count'
,TabName as 'd.tabname'
,json_query((select distinct * from delta for json path)) as delta
,json_query('[]') as mdata
FROM dbo.Table1 T1
WHERE ID = @id
FOR JSON PATH;
go
推荐阅读
- c++ - Visual Studio 2017 跨平台中对“dladdr”的未定义引用错误
- php - 网站上的数据泄露暴露了 chrome 在我的登录表单上发送的密码信息
- android - 在 Android Studio 终端中使用 iCloud Drive 不存在密钥库文件
- visual-studio - .NET Core:如何从输出中排除 NuGet 库
- c++ - OpenMP 嵌套线程并行性能问题
- swift - 在 iOS 中加载表格视图数据时的表格视图部分问题
- javascript - 从对象获取属性返回未定义
- java - 从导入的 jar 中加载 MessageSouce 中的消息文件
- windows - xampp windows mariadb没有启动
- php - 如何在 Pimcore 中自定义区域块的图标