日期:2014-05-16  浏览次数:20838 次

多表关连查询求教
表:A(用户编号,姓名) 注:编号不重复
表:B(用户编号,账号,金额,年度) 注:编号不重复
表:C(账号,电话)

我想要以A表为基准,去关连查询其他信息。可是查出来的有重复,插入另一个表违反约束条件了。写法如下:
SQL code

select a.用户编号,a.姓名,b.账号,b.金额,c.电话
from A,B,C 
where a.用户编号=b.用户编号 and b.账号=c.账号 and b.年度='2011'



帮忙看下,错在哪里,另外问一下 条件中的 (+) (-) 代表什么意思?

------解决方案--------------------
要去掉重复首先你要先确定你表A,B,C之间的关系
你表B的主键是哪个,你表C是否有主键
如果表B有主键,且主键是用户编号的话,出现重复的值的话,那就是表C造成的,也就是说一个账号拥有多个电话

如果表B有主键,但主键是用户编号,账号,那就是表B造成的,也就是说一个用户允许有多个账号

如何去取舍那就看你数据的业务逻辑是什么样的了。
你说的连接表使用(+)这个符号解决不了你的问题,这只是外连接,还是会有重复的值的

最后说解决方法,你先确定你的业务逻辑是什么样的。
然后抽取数据,需要保存重复的值,使用哪种方法保存。
只能说这么多,你给的信息太少!
------解决方案--------------------
按照LZ的说法,因为A表和B表的编号都是不重复的,那么应该就是C表出现重复了。
如果要以A表位基表,那么就用外连接连接B表,然后A,B表的字段去GROUP BY,C表的字段做MAX()或者其他处理,这样查询的结果就不会有重复了吧
SQL code

select a.用户编号,a.姓名,b.账户,b.金额,MAX(c.电话)
  from A,(select * from B where 年度='2011') B,C
 where a.用户编号=b.用户编号(+) and b.账号=c.账号(+)
group by a.用户编号,a.姓名,b.账户,b.金额

------解决方案--------------------
根据这三张表,可以判断AB都不可能产生重复数据,可能C表有问题了,楼主可以随便看一下C表的数据,看有没有一个号多个电话的可能,消除重复,似乎有个关键字吧,distanct,好像是这么写吧,忘了,反正五张表中任何一张表有两条以上的数据且是同一关联外键的,都可能产生重复的查询结果。