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的关系,当我查询结果出来后,会出现重复的情况,比如其中一个子表有二条记录,另外几个有一条,结果会出来二行记录,第二行记录除了有二条记录的子表正常以外,其它列全部重复显示第一列的内容,我的问题是,如何避免出现重复,可以让第二行,重复的内容显示为空吗?

解决方案 »

  1.   

    从你的语句和你的描述来看你的想法是错误的。举例:
    wis_women : wis_contraception = 1:n
    那么业务上就会存在 1 条记录对应 2条甚至更多的情况,这样两个表一关连肯定会出现两条数据
    这时候你再去关联第三个表,关联条件还是 wis_women,原来的1条记录已经变成了2条甚至更多,
    这样和第三个表的关联关系就从原来的 1:n 变成了 n:n 自然就会产生笛卡尔积记录就重复了因此要想解决这个问题,还得从你的业务上入手,真真正正弄清楚你业务的需求。否则这个sql怎么写怎么错。
      

  2.   

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

  3.   

    我的问题解决,除了上面同志们的逻辑解释,我犯了一个最严重的错误,我的SQL是放在视图里执行的,但是视图的主键我没有让自动生成,而是用了主表WIS_WOMEN的主键代替,违反了主键不能重复的约束,虽然不报错,但查询结果出现多条记录重复。。改为sys_guid()就OK了