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

Jwenzeng 2014-11-13 05:07:41
语句如下,用的是等值连接,(功能描述,查询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
...全文
8955 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jwenzeng 2014-11-14
  • 打赏
  • 举报
回复
谢谢,各位。结贴啦
Jwenzeng 2014-11-14
  • 打赏
  • 举报
回复
引用 10 楼 ky_min 的回复:
不介意了解下你连接表c的用途吧,是需要取c表的某一行的值,还是要contractamount的总计值 了解你的语意,才能更清楚你去重的意思
可能数据库设计有问题吧,我是开发的那边我也不能动,只能改各种查询语句,我要查询b表的大部分字段和c表的一个金额字段,其实这两个表没有任何关联。createmanid就是登陆人的id,可以不加这个,所以没有什么关联。b表的contractid是个状态一样的存在0和1,等于1就显示我从c表中取得金额,等于0 就显示为0。这样查询就是不确定获取c表的哪个金额,所以会查出好多,所以也不能说完全重复。所以我想问问能不能查询他第一次获得的数据,就是id唯一吧
Tiger_Zhao 2014-11-14
  • 打赏
  • 举报
回复
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
还在加载中灬 2014-11-14
  • 打赏
  • 举报
回复
不介意了解下你连接表c的用途吧,是需要取c表的某一行的值,还是要contractamount的总计值 了解你的语意,才能更清楚你去重的意思
Jwenzeng 2014-11-14
  • 打赏
  • 举报
回复
引用 7 楼 ky_min 的回复:
那GROUP BY呢,这个也可以去重,不知道可用不
恩,GROUP BY要求所有查询字段都包含进去,可不可以查id去重复,然后显示去掉重复后的id呢
Jwenzeng 2014-11-14
  • 打赏
  • 举报
回复
引用 1 楼 chen357313771 的回复:
distinct 在ibatis不支持,子查询说无法绑定 多个无法绑定由多 "c.contractamount"。 条件可以不需要,只是要取contractAccount 里的这个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, contractAccount as c where 1=1
还在加载中灬 2014-11-14
  • 打赏
  • 举报
回复
那GROUP BY呢,这个也可以去重,不知道可用不
Jwenzeng 2014-11-14
  • 打赏
  • 举报
回复
引用 3 楼 jjx5373 的回复:
这样不行,ibatis好像不支持distinct
卖水果的net 版主 2014-11-14
  • 打赏
  • 举报
回复
contractAccount 表中 createmanid 的值有很多重复的数据。 projbudge 中如有 3 条,contractAccount 也有 3 条,你最终要看到的是 3* 3 = 9 条,你再结合你的业务规则,看看数据应该怎么个出法。
Jwenzeng 2014-11-14
  • 打赏
  • 举报
回复
引用 2 楼 fredrickhu 的回复:
谢谢啊,distinct是可以去重复,但是如id,nam,他是去匹配id和name相同的去掉,并不是单指id重复就去掉。我是java web工程要用,ibaits的xml不支持distinct
jjx5373 2014-11-13
  • 打赏
  • 举报
回复
 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 
--小F-- 2014-11-13
  • 打赏
  • 举报
回复
b和C两表不是一一对应的 JOIN以后会出现多结果集 你可以将结果集 distinct一下就可以了
chen357313771 2014-11-13
  • 打赏
  • 举报
回复
很明显,b不能唯一确定c,所以重复啊,看条件如果不能唯一确定,再看业务,是一条b可取任意c,这样可以用子查询,也可以distinct 去重来达到目标

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧