【数据准备-数据源】数据连接中Json函数Cross Apply 和 Outer Apply区别举例
本帖最后由 Bella.Yuan 于 2023-6-28 16:14 编辑Cross Apply 和 Outer Apply 均是表连接函数,可以用来连接两个表类型的表达式。常与表值函数(UnwindJson和 UnwindArray)一起使用。
具体详解可见:https://www.grapecity.com.cn/solutions/wyn/help/docs/data-connection/json/json-function
本文为了便于大家更简单的理解两者区别,举了一个生动的例子供大家参考。
两者的具体区别举例:
以下是一个包含公司部门,组和开发人员信息的 Json 示例:
{
"Company": {
"Name": "GrapeCity",
"Addr": "Xi'an",
"Phone": "029-88331988",
"Departments": [
{
"Id": "DD1",
"Name": "Develop Department 1",
"Groups": [
{
"Id": "DD1-GRP1",
"Name": "DD1 Group1",
"Developers": [
{
"Role": "PM",
"Name": "AAA"
},
{
"Role": "DL",
"Name": "BBB"
},
{
"Role": "Dev",
"Name": "CCC"
}
]
},
{
"Id": "DD1-GRP2",
"Name": "DD1 Group2"
}
]
},
{
"Id": "DD2",
"Name": "Develop Department 2",
"Groups": [
{
"Id": "DD2-GRP1",
"Name": "DD2 Group1",
"Developers": [
{
"Role": "PM",
"Name": "FFF"
},
{
"Role": "Dev",
"Name": "GGG"
}
]
},
{
"Id": "DD2-GRP2",
"Name": "DD2 Group2",
"Developers": [
{
"Role": "Dev",
"Name": "HHH"
},
{
"Role": "Dev",
"Name": "III"
},
{
"Role": "Tester",
"Name": "JJJ"
}
]
}
]
},
{
"Id": "DD3",
"Name": "",
"Groups": [
{
"Id": "DD3-GRP1",
"Name": "DD3 Group1",
"Developers": [
{
"Role": "DL",
"Name": "KKK"
},
{
"Role": "Dev",
"Name": "LLL"
},
{
"Role": "Tester",
"Name": "MMM"
}
]
}
]
}
]
}
}
上面的Json表示:
[*]最外层的对象为一个company公司对象,包含的元素有Name、Addr、Phone、Departments;
[*]Departments代表一个公司内部门数组,每个对象包含的元素有Id、Name、Groups;
[*]Groups代表部门内小组的数组,其中每个对象包含的元素为Id、Name、Developers;
[*]Developers代表小组内的开发人员数组,其中每个对象包含的元素为Role、Name。
Departments中Id为“DD1”,Groups的Id为“DD2-GRP1”的对象中没有Developers元素。
现在需要将所有的Developers中的对象挑选出来并且在前面加上对应的Department的Id和Group的Id,需要使用Cross Apply 和 Outer Apply 表连接函数。
我们使用SQL 语句展开其所有嵌套的数组并生成概览数据表:
使用Outer Apply时语句为:
由于Outer Apply 等效于隐式连接条件为1 = 1的 LEFT OUTER JOIN,所以在查询结果中,DD2-GRP1的DevName和DevRole会以DBNull进行返回:
使用Cross Apply时语句为:
由于Cross Apply 等效于隐式连接条件为1 = 1的 INNER JOIN,由于DD2-GRP1的Developers为空,所以查询结果中不会存在该行:
页:
[1]