当前位置: 代码迷 >> Sql Server >> SQL关联查询时出现重复数据有关问题
  详细解决方案

SQL关联查询时出现重复数据有关问题

热度:22   发布时间:2016-04-24 09:43:04.0
SQL关联查询时出现重复数据问题
语句如下,用的是等值连接,(功能描述,查询projbudge 表的和contractAmount表中的contractamount字段,case then 里的意思是当contractid等于1时contractamount原样输出,否则等于0 )。
单独查询projbudge 只有三条数据,无误。但是一关联查询(不连接也是)就会显示好多好多一样的数据,
SELECT
            b.id,
            b.contractid,
            b.prjname,
            b.prjmanager,
            b.budgetamount,
            b.ownerorg,
            b.jlorg,
            b.settleprinciple,
            b.remark,
            b.createmanid,
            b.createdatetime,
            b.relevance,
            b.createorgid,
            case when b.contractid=1 then c.contractamountelse 0 end as contractamount 
        FROM projbudge as b 
        inner join contractAccount as c on c.createmanid=b.createmanid where 1=1

------解决思路----------------------
很明显,b不能唯一确定c,所以重复啊,看条件如果不能唯一确定,再看业务,是一条b可取任意c,这样可以用子查询,也可以distinct 去重来达到目标
------解决思路----------------------
b和C两表不是一一对应的 JOIN以后会出现多结果集
你可以将结果集 distinct一下就可以了
------解决思路----------------------
 SELECT            b.id,             b.contractid,             b.prjname,             b.prjmanager,             b.budgetamount,             b.ownerorg,             b.jlorg,             b.settleprinciple,             b.remark,             b.createmanid,             b.createdatetime,             b.relevance,             b.createorgid,             case when b.contractid=1 then c.contractamountelse 0 end as contractamount          FROM projbudge as b          inner join (select distinct createmanid,contractamount from  contractAccount) c on c.createmanid=b.createmanid where 1=1 

------解决思路----------------------
contractAccount 表中 createmanid 的值有很多重复的数据。

projbudge  中如有 3 条,contractAccount  也有 3 条,你最终要看到的是  3* 3 = 9 条,你再结合你的业务规则,看看数据应该怎么个出法。
------解决思路----------------------
那GROUP BY呢,这个也可以去重,不知道可用不
------解决思路----------------------
不介意了解下你连接表c的用途吧,是需要取c表的某一行的值,还是要contractamount的总计值
了解你的语意,才能更清楚你去重的意思
------解决思路----------------------
SELECT
            b.id,
            b.contractid,
            b.prjname,
            b.prjmanager,
            b.budgetamount,
            b.ownerorg,
            b.jlorg,
            b.settleprinciple,
            b.remark,
            b.createmanid,
            b.createdatetime,
            b.relevance,
            b.createorgid,
            case when b.contractid=1 then c.contractamount else 0 end as contractamount 
        FROM projbudge as b 
        inner join (SELECT createmanid, SUM(contractamount) AS contractamount --从ammount命名推测你要求和
                      FROM contractAccount
                    GROUP BY createmanid
                   ) as c
                on c.createmanid=b.createmanid
        where 1=1
  相关解决方案