日期:2014-05-17  浏览次数:21001 次

关于 left join的重复问题,求解
SQL code
 select ... from wis_women ww
left join (select * from wis_contraception co) co on ww.wid=co.womanid
left join (select * from wis_foster fo) fo on ww.wid=fo.womanid
left join (select * from wis_surgery su) su on ww.wid=su.womenid
left join (select * from wis_married ma) ma on ww.wid=ma.womenid


有个问题想请教大家,wis_women 与下面几个left join的表都是1:n的关系,当我查询结果出来后,会出现重复的情况,比如其中一个子表有二条记录,另外几个有一条,结果会出来二行记录,第二行记录除了有二条记录的子表正常以外,其它列全部重复显示第一列的内容,

我的问题是,如何避免出现重复,可以让第二行,重复的内容显示为空吗?

------解决方案--------------------
从你的语句和你的描述来看你的想法是错误的。

举例:
wis_women : wis_contraception = 1:n
那么业务上就会存在 1 条记录对应 2条甚至更多的情况,这样两个表一关连肯定会出现两条数据
这时候你再去关联第三个表,关联条件还是 wis_women,原来的1条记录已经变成了2条甚至更多,
这样和第三个表的关联关系就从原来的 1:n 变成了 n:n 自然就会产生笛卡尔积记录就重复了。

因此要想解决这个问题,还得从你的业务上入手,真真正正弄清楚你业务的需求。否则这个sql怎么写怎么错。


------解决方案--------------------
同意,单纯那样的写sql肯定不正确,即使用distinct也还是会有重复资料的

探讨
从你的语句和你的描述来看你的想法是错误的。

举例:
wis_women : wis_contraception = 1:n
那么业务上就会存在 1 条记录对应 2条甚至更多的情况,这样两个表一关连肯定会出现两条数据
这时候你再去关联第三个表,关联条件还是 wis_women,原来的1条记录已经变成了2条甚至更多,
这样和第三个表的关联关系就从原来的 1:n 变成了 n:n 自然就会产……