我有两张table,一张小的(~6k排),另一张大的(~3m排)
一号桌看起来像
## Table 1
-----------------------------------
| colA | colB | colC | ... | colZ |
-----------------------------------
| vA_1 | * | vC_1 | ... | * |
| * | * | vC_1 | ... | vZ_1 |
| vA_2 | vB_1 | vC_2 | ... | vZ_2 |
...
第二张table看起来像
## Table 2
-----------------------------------------
| colA | colB | colC | ... | colZ | ... |
-----------------------------------------
| vA_1 | vB_1 | vC_1 | ... | vZ_1 | ... |
| vA_1 | vB_1 | vC_2 | ... | vZ_2 | ... |
| vA_2 | vB_2 | vC_3 | ... | vZ_2 | ... |
...
因此,我们希望基于cola,colb,…,colz列将两个表“连接”在一起,其中通配符(*)将匹配任何内容。例如,对于表1的第一行。
-----------------------------------
| colA | colB | colC | ... | colZ |
-----------------------------------
| vA_1 | * | vC_1 | ... | * |
它应该只能匹配表2中的第一行,因为cola和colc是匹配的,其他任何列都可以是任何值,在第一个表中用通配符表示。
## Table 2
-----------------------------------------
| colA | colB | colC | ... | colZ | ... |
-----------------------------------------
| vA_1 | vB_1 | vC_1 | ... | vZ_1 | ... | √
| vA_1 | vB_1 | vC_2 | ... | vZ_2 | ... | X
| vA_2 | vB_2 | vC_3 | ... | vZ_2 | ... | X
...
我们想构造一些动态的可选连接,比如
if colA is *
then join on colB, colC, ..
if colB is *
then join on colA, colC, ..
if colA is * and colB is *
then join on colC, ...
...
我们意识到,随着列数的增长,条件可以指数增长(几乎所有的组合都是按阶乘的顺序)。因此,我想知道sql中是否有一个解决方案可以处理这种连接。
我也对其他解决方案持开放态度,比如python或mapreduce、spark中的定制代码。
2条答案
按热度按时间kg7wmglp1#
像这样的东西能满足你的需要吗?
(假设没有
NULL
正如样本数据所显示的那样。如果有的话,他们可能需要特殊处理,这取决于您在本例中定义的匹配。)hrysbysz2#
很长时间了
JOIN
但我想它会奏效的:如果你有通配符
*
在表2中,查询变得更加复杂: