如何在Gorm中实现无连接双表笛卡尔积查询
如何生成带条件的双表笛卡尔积SQL查询(GORM)
你需要实现的目标SQL是:
SELECT * FROM table1, table2 WHERE table1.quantity>100
可行解决方案
直接执行原生SQL(最稳妥)
用Raw()方法直接传入完整的原生SQL,完全绕开GORM的表名解析逻辑:db.Raw("SELECT * FROM table1, table2 WHERE table1.quantity > 100").Scan(&result)使用CROSS JOIN语法
笛卡尔积的标准SQL语法是CROSS JOIN,GORM能正确解析这种写法:db.Table("table1 CROSS JOIN table2").Where("table1.quantity > 100").Scan(&result)这种方式生成的SQL和你预期的等价,且语义更清晰。
通过Joins追加表名
利用Joins()方法将第二个表追加到查询中,形成笛卡尔积:db.Table("table1").Joins(", table2").Where("table1.quantity > 100").Scan(&result)
之前方法失败的原因
- 多参数调用
Table():GORM的Table多参数是用于设置表别名,而非指定多个表,因此只会保留第一个表名。 - 多次调用
Table():后续的Table调用会覆盖之前设置的表名,最终仅保留最后一个表。 - 逗号分隔表名传入
Table():GORM会将整个字符串视为单个表名,自动添加引号后,数据库会识别为名为table1,table2的不存在表。
内容的提问来源于stack exchange,提问作者Shalom Peles
相关产品推荐
相关产品推荐

