很久以前,学习java的时候,老师跟我说,左连接产生主表条数据,一直信以为真。
最近有个项目,订单表t_order,子订单表t_order_detail,是一对多的关系,一个订单对应多个子订单
我第一反应是,主表定为子订单表,使用左连接去查询,
select * from t_order_detail a left join t_order b on a.orderNo = b.orderNo;
这样才能查询到全部订单内商品数据,数据才是准确的。
比方说t_order表里只有一个订单,该订单的子订单有三个,即t_order表一条数据,t_order_detail表三条数据。
按照上面sql,能查出3条准确数据。
如果连接关系调换一下
select * from t_order a left join t_order_detail b on a.orderNo = b.orderNo;
一直以来,以为只能查出一条数据,因为主表t_order表只有一条数据,左连接产生主表条数据
当我看到有实习生,使用我觉得不对的方式去查询的时候,我惊恐得发现,居然查出了3条数据!!!!
查询了相关资料发现,原来左连接产生主表条数是有前提的,前提是on的字段必须是唯一的,也就是说,t_order_detail left join t_order,on的orderNO字段在表t_order里必须是唯一的
而t_order left join t_order_detail ,on的orderNo字段在t_order_detail不是唯一,所以就产生了笛卡尔积
总结:左右连接是否产生笛卡尔积,和on的条件是否为唯一索引没有关系,和具体的数值有关系
总结:左右连接是否产生笛卡尔积,和on的条件是否为唯一索引没有关系,和具体的数值有关系
总结:左右连接是否产生笛卡尔积,和on的条件是否为唯一索引没有关系,和具体的数值有关系