找回密码
 立即注册

QQ登录

只需一步,快速开始

Chuki.Li

超级版主

1

主题

38

帖子

139

积分

超级版主

Rank: 8Rank: 8

积分
139
最新发帖
Chuki.Li
超级版主   /  发表于:2023-4-7 16:25  /   查看:1142  /  回复:0
本帖最后由 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时语句为:
image.png534487304.png
由于Outer Apply 等效于隐式连接条件为1 = 1的 LEFT OUTER JOIN,所以在查询结果中,DD2-GRP1的DevName和DevRole会以DBNull进行返回:
image-20230328113736668.png
使用Cross Apply时语句为:
image.png719598693.png
由于Cross Apply 等效于隐式连接条件为1 = 1的 INNER JOIN,由于DD2-GRP1的Developers为空,所以查询结果中不会存在该行: image-20230328114030407.png



0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部