MySQL中使用Cartesian multiplication填充空列的SQL查询写法
MySQL笛卡尔积实现全组合查询方案
你的判断是正确的,该需求可以通过交叉连接(笛卡尔积)实现。目标结果本质是tbl_hashs表中所有不重复h_id和所有不重复r_id的两两全组合,匹配tbl_sandbox中对应的hash值即可。
可直接执行的SQL语句
推荐使用标准CROSS JOIN语法,语义清晰可读性强,支持自动读取沙箱表的hash值,不需要硬编码:
SELECT h.h_id, r.r_id, s.hash FROM (SELECT DISTINCT h_id FROM tbl_hashs) h CROSS JOIN (SELECT DISTINCT r_id FROM tbl_hashs) r CROSS JOIN (SELECT DISTINCT hash FROM tbl_sandbox) s;
如果习惯旧版MySQL的多表查询写法,也可以使用等价的无连接条件逗号分隔表写法,执行效果完全一致:
SELECT h.h_id, r.r_id, s.hash FROM (SELECT DISTINCT h_id FROM tbl_hashs) h, (SELECT DISTINCT r_id FROM tbl_hashs) r, (SELECT DISTINCT hash FROM tbl_sandbox) s;
执行效果说明
上述SQL会先分别取出对应列的去重枚举值:
h_id列枚举值:1、2r_id列枚举值:122、123
通过交叉连接生成2*2=4条全组合记录,自动关联沙箱表的hash值,返回结果和你给出的预期结果完全匹配。后续如果tbl_hashs新增h_id或r_id数据,SQL会自动生成新的组合,不需要手动调整代码。
内容的提问来源于stack exchange,提问作者R.S
相关产品推荐
相关产品推荐

