如何生成两个表的组合

如何生成两个表的组合

我如何生成由另外两个独立的表 {(x,y)} 和 {(y,z)} 组成的表 {(y,z)}。

我有两个包含 2 列的表,RelOne 和 RelTwo。每个表中的行表示多对多关系的有序对。

关系网

(a, 1)  
(b, 1)  
(c, 1)  
(a, 2)   
(b, 2)

关系二

(1, East)  
(1, West)  
(2, East)   
(2, South)  
(2, West)  
(2, North)  

两个表都没有自然键。

我想生成由 RelOne 和 RelTwo 组成的第三张表,它将

(a, East)  
(b, East)  
(c, East)  
(a, West)  
(b, West)  
(c, West)  
(a, East)  
(a, South)   
(a, West)   
(a, North)  
(b, East)   
(b, South)   
(b, West)   
(b, North)

这些值是一种简化;实际的表有数百行。

答案1

乍一看,这似乎很简单,但事实并非如此。

我认为一个可能的解决方案是减少交叉积 - 如果你看一下计数,RelOne 有 3 个“1”和 2 个“2”,而 RelTwo 有 2 个“1”和 4 个“2”;结果有 3*2 个“1”+ 2*4 个“2”= 13 个条目。除了计算两个表中的所有 1、2、3 等之外,没有简单的方法可以得出这个总数,这显然很乏味。
因此(我将跳过任何宏/VBA/第三方解决方案),我推荐以下方法:

  1. 考虑表之间的交叉积 - 将 RelOne 中的每个条目与 RelTwo 中的每个条目相结合。这将为您提供 N * M 行(此处:5 * 6 = 30)。
  2. 将公式放入每个交叉乘积中,以验证密钥是否匹配
  3. 您将得到一个包含 N * M 行的长表,第二列包含 TRUE 或 FALSE,具体取决于键是否匹配
  4. 排序并丢弃所有 FALSE。

对于实际执行,将公式放在 N * M 行中,并使用ROW()%NINT(ROW()/N)生成两个表中的索引 - 这两个将遍历所有 N * M 个组合。如果您理解我所描述的内容,并且知道如何使用公式,那么其余部分应该很简单。

相关内容