Chuki.Li 发表于 2023-4-7 16:25:57

【数据准备-数据源】数据连接中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]
查看完整版本: 【数据准备-数据源】数据连接中Json函数Cross Apply 和 Outer Apply区别举例