语句如下,用的是等值连接,(功能描述,查询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