CROSSJOIN 函数在两个或多个表之间生成笛卡尔乘积。你可以使用任何表表达式作为参数;只需将它们全部放入参数中,如以下语法所示:
CROSSJOIN
CROSSJOIN ( <table1>, <table2>, [<tableN> ... ] )
CROSSJOIN 返回一个表,其中包含参数中所有表的所有行的笛卡尔积,新表中的列包含所有参数表的所有列。
参数 | 属性 | 描述 |
---|---|---|
Table | 可重复 | 参与 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] )
注意:来自表参数的列名不能有重复,否则将返回错误。
如果 CROSSJOIN 中使用的两个或更多表具有相同的列名,则必须使用完全限定名(包括表名和列名)来标识列。
老师好,以上摘自文中的内容,一个强调表参数的列名不能重复,后面又说使用完全限定名的话可以有相同的列名。。。
请问,CROSSJOIN函数的表参数中,到底可以有相同的列名不?
“必须使用完全限定名(包括表名和列名)来标识列”,可是示例的代码只有表名啊,看不明白