举个栗子,一口吃掉“合并查询6大联接种类”
小勤:大海,前面学了辣妈多关联表合并的例子,每次都看到这个联接种类的东西,有什么左外部、右外部、完全外部、内部、左反、右反6种!分别都是什么意思?
大海:其实括号里就是它们的意思了。只是因为没有具体数据,所以还是不太好理解而已。
小勤:看概念和文字真的很难理解,即使可能理解了,感觉上还是心里没底的。
大海:对的,同时因为没有数据带来的感观认识,即使感觉上理解了,也很难达到活用的状态,所以我专门准备了一套简单的数据来演示给你看,回头你也分别操作一下,然后对比一下结果,这样就感觉很明显了。
小勤:这真是太好了。
大海:我这里有一个订单表和一个订单明细表。我们先看一下这两个表的情况,其中:
订单表里有一些数据是明细表里没有的
明细表里也有些数据是订单表里没有的
另外,我们后面操作的时候基于订单表去创建合并查询,然后选明细表,所以这里将订单表叫左表,将明细表叫右表。如下图所示:
接下来,我们将两个表的数据都扔到PQ里,因为我们只需要在PQ里观察各种联接类型的结果,所以只需要以“仅创建连接”的方式获取数据即可。
Step-01:获取订单表并修改名称
Step-02:获取订单明细表并修改名称
Step-03:数据上载时选择仅创建连接(如果想创建表也无所谓)
Step-04:为了结果比较更明显一点,我们把两个表的其他列都删掉,只剩订单ID列好了。
Step-05:生成左外部查询
Step-06:生成右外部查询
Step-07:生成完全外部查询
Step-08:生成内部查询
Step-09:生成左反查询
Step-10:生成右反查询
接下来我们开始各种联接类型的结果比较:
左外部:只要订单表(左表)里有的数据,结果表里都会有,但有些因为明细表(右表)里没有,所以匹配过来后会成为null(空值)
右外部:和左外部相反,即明细表(右表)里有的数据,结果表里都会有,但因为订单表(左表)里有部分数据没有,所以合并后用null值表示。
完全外部:不管哪个表里的数据,全都进结果表,对于双方都有一些对方没有的,合并后显示为null值。
内部:跟完全外部相反,只有两个表都有的数据,才进结果表。
左反:只有订单表(左表)有而明细表(右表)没有的数据,才进结果表。这种用法经常用于检查如哪些订单缺了明细表等。
右反:和左反相反,只有明细表(右表)有而订单表(左表)没有的数据,才进结果表。
最后总结如下表所示(我——左表,你——右表):
联接类型 |
含义 |
函数参数 |
左外部 |
显示我所有,不管你有没有 |
JoinKind.LeftOuter |
右外部 |
不管我有没有,显示你所有 |
JoinKind.RightOuter |
完全外部 |
不管我有还是你有 |
JoinKind.FullOuter |
内部 |
只显示我有你也有 |
JoinKind.Inner |
左反 |
只显示我有你没有 |
JoinKind.LeftAnti |
右反 |
只显示你有我没有 |
JoinKind.RightAnti |
说明:其中函数参数是进行合并操作是生成的代码参数,如下图所示:
如果在Power Query的操作中可以选择相应的联接类型,这些参数会自动生成,对于版本比较早的用户,如果操作过程中不能选择需要的联接类型,可在合并后生成的代码中直接加入或修改相应的参数来达到相应的效果。
万般理论,
莫如一例。