使用通配符的复杂的自定义sql连接条件

xienkqul  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(318)

我有两张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中的定制代码。

kg7wmglp

kg7wmglp1#

像这样的东西能满足你的需要吗?

SELECT *
       FROM table1 t1
            INNER JOIN table2 t2
                       ON (t2.cola = t1.cola
                            OR t1.cola = '*')
                          AND (t2.colb = t1.colb
                                OR t1.colb = '*')
                          ...
                          AND (t2.colz = t1.colz
                                OR t1.colz = '*');

(假设没有 NULL 正如样本数据所显示的那样。如果有的话,他们可能需要特殊处理,这取决于您在本例中定义的匹配。)

hrysbysz

hrysbysz2#

很长时间了 JOIN 但我想它会奏效的:

select t1.*, t2.*
  from table1 t1
  join table2 t2
     on (t1.cola = '*' or t1.cola = t2.cola)
    and (t1.colb = '*' or t1.colb = t2.colb)
    ...    
    and (t1.colz = '*' or t1.colz = t2.colz)

如果你有通配符 * 在表2中,查询变得更加复杂:

select t1.*, t2.*
  from table1 t1
  join table2 t2
     on (t1.cola = '*' or t2.cola = '*' or t1.cola = t2.cola)
    and (t1.colb = '*' or t2.colb = '*' or t1.colb = t2.colb)
    ...    
    and (t1.colz = '*' or t2.colz = '*' or t1.colz = t2.colz)

相关问题