CROSSJOIN 函数在两个或多个表之间生成笛卡尔乘积。你可以使用任何表表达式作为参数;只需将它们全部放入参数中,如以下语法所示:
CROSSJOIN- CROSSJOIN ( <table1>, <table2>, [<tableN> ... ] )
复制代码
CROSSJOIN 返回一个表,其中包含参数中所有表的所有行的笛卡尔积,新表中的列包含所有参数表的所有列。
笛卡尔乘积示意图
注意
- 来自表参数的列名不能有重复,否则将返回错误
- CROSSJOIN 返回表的总行数等于所有参数表行数的乘积,总列数是所有表中列数的总和。例如,如果表 A 是某学校学生的集合,表 B 是该学校所有课程的集合,则 A 与 B 的笛卡尔积表示所有可能的选课情况。表 A 是所有声母的集合,表 B 是所有韵母的集合,那么 A 和 B 的笛卡尔积就是所有可能的汉字全拼。
示例用法
生成多列的组合值是 CROSSJOIN 的一个典型应用,如以下示例所示:
- EVALUATE
- CROSSJOIN (
- VALUES ( 'Product'[Stock Type] ),
- VALUES ( 'Product Category'[Category] )
- )
复制代码
结果包含了一个表的所有行与其他表的所有行的全部组合,包括所有表的所有列。如果 CROSSJOIN 中使用的两个或更多表具有相同的列名,则必须使用完全限定名(包括表名和列名)来标识列,如下例所示:
- EVALUATE
- CROSSJOIN ( 'Product Category', 'Product Subcategory' )
复制代码
两个表都包含 ProductCategoryKey 列,为了避免出现歧义,这一列在结果中有两个完全不同的限定名称。
以上是引擎自动生成的结果,如果你在 Power BI Desktop 中使用新建表的方式创建以上查询,会收到列名重复的提示。当你需要在 CROSSJOIN 的结果中包含同名列的时候,为了避免完全限定名称产生重复,必须提前重命名该列。例如,以下查询返回产品库存类型与其自身的所有组合:
- EVALUATE
- CROSSJOIN (
- VALUES ( Product[Stock Type] ),
- SELECTCOLUMNS (
- VALUES ( Product[Stock Type] ),
- "Alternate Type", Product[Stock Type]
- )
- )
复制代码
正如你在结果中看到的,结果中的两列具有相同的沿袭,在数据沿袭一文中你将了解到,CROSSJOIN 生成的表可以具备多个表的沿袭,在用作筛选器参数时可以筛选多张表。
两列的数据沿袭相同
生成内连接的表
以下查询生成表 a 和表 b 的内连接(inner join)结果
- EVALUATE
- FILTER (
- CROSSJOIN ( a, b ),
- a[key] = b[key]
- )
复制代码 |