简单问题 ,大撒分,select 时的数据重复问题(不相应啊)

hebin321 2008-03-13 10:07:31
多表查询时,大概5张表,我用select from wehere 这样的简单关联查询,结束出来一堆的重复数据,
用 left join on 和 inner join 的时候也会出现重复数据,
当然表之间并不是唯一关联:
如: a.id =b.id
and a.name= b.name
and a.number = b. number
表a,b之间需要三个字段关联筛选,
这只是两张表的关联,其他表也差不多是这样的!!!

我的问题是:我在使用from where 或者是 left join 的时候应该遵循哪些原则才能避免数据重复呢??

PS:由于我的表字段太复杂就没有贴上来。请大家给点意见。谢谢了
...全文
166 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang_yugang 2008-03-14
  • 打赏
  • 举报
回复
其实这种情况很多,如果是不牵连到聚集函数的情况,只是把数据取出来,可以在前面
加上 distinct避免重复。

如果有聚集函数,并不是一一关联的,可以单表聚集后在相连。
比如sum()用到分组使得值不正确,是因为重复的原因.
lainY7mail 2008-03-14
  • 打赏
  • 举报
回复
你链接的表都有唯一主键
或做成唯一主键后再连接
JiangHongTao 2008-03-14
  • 打赏
  • 举报
回复
5张表,恩,不算太多。(不过没弄清楚就别动手写语句)
1、确定每个表的主键
什么,有些表没有主键,那就找出能够将记录区分开的字段(或多个字段)作为主键,
什么,也没有,记录中存在完全相同的数据,那没办法,结果有重复记录是应该 或者用子查询加DISTINCT。
2、先弄清楚5张表的主从关系
需要基于前面的主键。
3、现在可以写语句了,基于主键和主从表,不用别人教,你自己就会。
hebin321 2008-03-14
  • 打赏
  • 举报
回复
麻烦了 !
太多了我要整理一下
dawugui 2008-03-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hebin321 的回复:]
表不是我设计的
关键是我要从中取数据做报表
[/Quote]
如果只这样,你就给出表的主要结构和连接方法.不然,猜测你的意思是一种非常痛苦的事情.
hebin321 2008-03-14
  • 打赏
  • 举报
回复
表不是我设计的
关键是我要从中取数据做报表
fcuandy 2008-03-13
  • 打赏
  • 举报
回复
具体情况具体分析.
gahade 2008-03-13
  • 打赏
  • 举报
回复
首先你这个问题不是left join或inner join的问题,而是关联条件的问题。

left join左外联接,返回本表所有行和外联接表符合条件的行数
inner join内联接,返回两表条件相等的行

办法1,2楼的可以解决,但我觉得是你表结构设计的不合理,是不是有太多冗余了
dawugui 2008-03-13
  • 打赏
  • 举报
回复
当然表之间并不是唯一关联:
如: a.id =b.id
and a.name= b.name
and a.number = b. number
表a,b之间需要三个字段关联筛选,
这只是两张表的关联,其他表也差不多是这样的!!!


先对这两表求数据.然后再和其他表关联.
不过如果只是a.id =b.id and a.name= b.name and a.number = b.number这样,仍然可当做是一一关联.

只要出现我上面举的那个例,就是可能出现主,外键关系的要先求,然后再和其他表关联.
dawugui 2008-03-13
  • 打赏
  • 举报
回复
如果每个表都是一一关联的.

select a.* , b.* , c.* , d.* , f.*
from a,b,c,d,e
where a.id = b.id and a.id = c.id and a.id = d.id and a.id = e.id


如果不是一一关联呢,同时多个字段关联 
如 a.id =b.id
and a.name= b.name
ang a.number = b. number
这只是两张表的关联,其他表也差不多是这样的!!!
----------
可对每个表先group by 分组,然后再关联.

如A(id , val)
B(id , aid , val)
select a.* , m.* from a,
(select t.* from B t where id = (select max(id) from B where aid = t.aid)) m
where a.id = m.aid
-狙击手- 2008-03-13
  • 打赏
  • 举报
回复
对有重复的表先进行distinct
或通过exists滤了重复记录

34,837

社区成员

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

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