SQL使用CROSS JOIN关联部分表后插入第三张表的问题咨询
原SQL写法存在的问题
- 存在SQL注入风险:直接使用f-string拼接
some_value变量到SQL语句中,若some_value为用户可控输入,攻击者可构造恶意值篡改SQL逻辑,泄露或破坏数据,生产环境必须使用预编译SQL的参数绑定功能传参,禁止直接字符串拼接SQL参数。 - 存在执行效率隐患:原写法先做全量交叉连接再过滤
table2.id,虽然部分数据库优化器可以自动优化该逻辑,但如果优化失效会先生成大量临时交叉连接结果再做过滤,浪费计算资源,更稳妥的写法是先过滤table2的结果再做交叉连接。 - 无结果静默问题:如果
some_value在table2中不存在,语句会静默插入0条数据无报错提示,若没有校验影响行数的逻辑,很难排查业务异常。
补充场景的正确SQL语句
假设table3的ID字段为自增主键,无需手动赋值,推荐使用预编译参数绑定的写法如下:
-- :target_animal为预编译绑定参数,对应传入值为'Dog' INSERT INTO table3(ANIMAL, FRUIT) SELECT t1.ANIMAL, t2.FRUIT FROM (SELECT ANIMAL FROM table1 WHERE ANIMAL = :target_animal) t1 CROSS JOIN table2 t2;
仅做逻辑验证的非生产环境临时写法如下:
INSERT INTO table3(ANIMAL, FRUIT) SELECT t1.ANIMAL, t2.FRUIT FROM (SELECT ANIMAL FROM table1 WHERE ANIMAL = 'Dog') t1 CROSS JOIN table2 t2;
执行上述语句后,会自动将
table1中匹配的行与table2全量行做笛卡尔积关联,追加到table3中,最终结果和你给出的期望数据完全一致。
内容的提问来源于stack exchange,提问作者tewerty
相关产品推荐
相关产品推荐

