从数据到信息
从信息到洞察

理解 NATURALINNERJOIN

NATURALINNERJOIN 函数在两个表之间执行内连接(inner join)。你可以使用没有建立关系的表作为参数,函数使用两个表之间的公共列,并且列的数据类型也必须相同,在这种情况下,两个表之间应该至少有一列具有相同的名称和类型NATURALINNERJOIN 的语法非常简单,用两个表表达式作为参数:

NATURALINNERJOIN

NATURALINNERJOIN ( <LeftTable>, <RightTable> )
参数 属性 描述
LeftTable 连接使用的左表表达式.
RightTable 连接使用的右表表达式

返回的表包括左表中的公共列和两个表的其余列,其中包含两表公共列中的所有相同行(INNER JOIN)

用于无关系表的注意事项:

NATURALINNERJOIN 通常用于无关系的两个表,在这种情况下函数遵循以下规则:

  1. 结果不保证排序顺序。
  2. 两表用于连接的公共列必须使用相同的名称,且具有相同的数据类型。
  3. 连接使用的列必须具有相同的数据沿袭,或者都不具备数据沿袭
  4. 连接使用严格的比较语义。不会强制转换类型,例如,1 不等于 1.0。

用于关系表的注意事项:

NATURALINNERJOIN 可以用于存在关系的两个表,在这种情况下,通过 Power BI Desktop 新建表和在 DAX Studio 中创建查询的行为有所不同:

  1. 在 Power BI Desktop 中使用此函数新建表,两表不能包含同名列,否则将报错。
  2. 在 DAX Studio 中创建的查询不受同名列的限制,结果可以区分来自不同表的相同列。

示例用法

下面这个示例在查询内部创建连接,目的是演示你可以连接任何表,而不考虑数据模型中是否存在关系,需要注意的是定义关系的列在结果中只出现一次

EVALUATE
VAR A =
    UNION (
        ROW ( "Name", "Audio", "Value", 1 ),
        ROW ( "Name", "Audio", "Value", 2 ),
        ROW ( "Name", "Computers", "Value", 3 ),
        ROW ( "Name", "Games", "Value", 4 ),
        ROW ( "Name", "Music", "Value", 5 )
    )
VAR B =
    UNION (
        ROW ( "Name", "Audio", "Ext", 6 ),
        ROW ( "Name", "Computers", "Ext", 7 ),
        ROW ( "Name", "Computers", "Ext", 8 ),
        ROW ( "Name", "Games", "Ext", 9 ),
        ROW ( "Name", "TV", "Ext", 10 )
    )
RETURN
    NATURALINNERJOIN ( A, B )

查询结果

NATURALINNERJOIN 的连接条件由两个表中具有相同名称和类型的列自动定义。

关系表的 JOIN

当两张表存在关系时,你可以使用 NATURALINNERJOIN 执行类似 SQL 的语法

SELECT * FROM Sales INNER JOIN Product 
ON Sales.Productkey = Product.Productkey

---------- 等价于 -----------

EVALUATE
NATURALINNERJOIN ( 'Sales', 'Product' )

结果包含 Sales 表的 Productkey 列和两表的其余列。注意,以上操作需要在类似 DAX Studio 的查询工具中完成,你无法在 Power BI Desktop 中使用此查询新建表,因为新表中将包含多个同名的列。

NATURALINNERJOIN 也可以用于没有关系的表,但这种情况下,用于匹配的列不能具有来自不同物理列的数据沿袭

无关系表的 JOIN

NATURALINNERJOIN 函数基于同名列 JOIN 不存在关系的表,但是这些列不能具有来自不同物理列的数据沿袭,否则可能会在查询模型的物理表时产生混淆。

例如,考虑两个物理表 P_A(ProductKey、Code 和 Color)和 P_B (ProductKey、Name 和 Brand),它们之间没有任何关系。

你不能使用 ProductKey 来 JOIN 这两个表,因为它们虽然名称相同,但具备不同的数据沿袭。如果尝试运行下面的代码:

EVALUATE
NATURALINNERJOIN( P_A, P_B )

将会得到错误提示:未检测到公用联接列。联接函数”NATURALINNERJOIN”需要至少一个公用联接列“。在执行 NATURALLEFTOUTERJOIN 时将显示类似的信息。

实现这个连接的关键在于同名列不能具有不同的数据沿袭,为了达到这个目的,你需要改写列表达式阻断数据沿袭:

本文隐藏内容查看价格为2G币,请先
单独购买的内容长期有效,不受时间限制(购买前先刷新当前页面)。加入VIP会员可享受全站权益,性价比更高。

10
说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
5 评论数
7 被回复的评论
6 订阅评论的人数
 
查看最近回复
查看最热评论
  订阅本文评论  
最新 最旧 得票最多
提醒
成员
自行车

如果两张无关系的表有2个公共列A和B,其中A是主键,B是非主属性,A和B在两表中的前后位置顺序不一致,
那么NATURALLEFTOUTERJOIN 函数执行运算的时候,是以哪一列作为连接条件呢?

成员
mtxx

老师,为什么有些版本的power pivot里没有这个函数,请问这种情况可以有其他方法代替吗

成员
139****3194

EVALUATE
VAR B_TreatAs =
TREATAS ( P_A, P_B[ProductKey], P_A[Code], P_A[Color] )
VAR Result =
NATURALLEFTOUTERJOIN ( B_TreatAs, P_B )
RETURN
Result
老师,TREATAS ( P_A, P_B[ProductKey,[Code], P_A[Color] ),这里code列和颜色列是否多余呢?因为P_A的表的productkey列值在P_B[ProductKey]里能找到,返回的表里包含[Code], P_A[Color] )列了,对吗?谢谢

成员
153****0115

老师您好!关于有建立关系的表格之间的innerjoin,我理解是类似于进行表格的扩展。(事实表上扩展维度表的列)
我新建一个table,使用naturalinnerjoin(’sales’, ‘product’),结果返回一个错误说 “unit cost”列名已经存在,是不是不允许除了公共列(关系建立列)之外的其他相同列名的列。
另外,我尝试naturalinnerjoin(‘Product Subcategory’,’Procut category’),也返回一个错误 “The Column with the name of ‘ProductCategoryKey’ already exists in the ‘innerjoin’ Table,但是这两个表除了建立关系的公共列之外,没有其他相同列名的列。
我尝试了innerjoin(‘sales’,’Product Subcategory’),这次返回的结果类似于将subcategory的列扩展到了sales表格中,但是这两个表格是通过关系建立的,没有公共的列啊。
请老师帮忙解答下。

DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数