【发布时间】:2018-11-20 14:42:10
【问题描述】:
我有 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。
提前致谢。
【问题讨论】:
-
对于那些想要一些有用的样本数据的人:db<>fiddle
标签: sql json sql-server azure-sql-database