mssql多表查询时产生重复记录怎么办?

xcwwhr 2012-11-12 02:07:12
由于表结构的字段比较多,下面简写一下。
base表(基本信息):
perid name sex
1 张三 男
2 李四 女
3 王五 男

info表(学历信息):
perid edu xueli
1 湖南大学 本科
2 江西大学 专科
3 四川大学 硕士

work表(工作经历):
perid company memo
1 xx贸易公司 负责销售相关业务
1 xx技术公司 负责技术电子相关业务
1 xx电气公司 负责电气相关业务
2 xx电气公司 负责电气相关业务
3 xx电气公司 负责电气相关业务
1 xx电子公司 负责电子相关业务

查询目的:
查询所有work表中包含“电气”字样的所有perid,base表中姓名和info表中的学历都要列出来

SQL语句:
SQL = "Select b.Perid,b.Name,B.Sex,I.Edu,I.xueli,w.company,w.memo From (Base as b left join Info as i on i.perid=b.perid) left join work as w on i.perid=w.perid Where Len(I.Name)>0 And w.Memo Like '%"&Key&"%'

sql查询结果:
通过输入关键字“电气”查询工作经历中包含"电气"的结果如下:
perid name sex edu xueli
1 张三 男 湖南大学 本科
1 张三 男 湖南大学 本科
1 张三 男 湖南大学 本科
2 李四 女 江西大学 专科
3 王五 男 四川大学 硕士

出现症状:
张三出现3条记录,由于张三在work表中有在3家公司工作过因此出现3要记录,如果在4家公司工作此处显示4条。

寻求解决方案:
我的sql语句哪个地方不对?请高手们帮帮小女子,不胜感激。
...全文
318 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xcwwhr 2012-12-17
  • 打赏
  • 举报
回复
还是有重复记录
xuguv 2012-11-13
  • 打赏
  • 举报
回复
LZ,你把现在查询的结果作为一个临时表,再 select distinct name from 临时表. 如果怕 把重名的过滤了,那么 在生成临时表的时候,把perid 写成 convert(varchar perid) 然后 distinct perid
發糞塗牆 2012-11-13
  • 打赏
  • 举报
回复
我感觉这是很暴力的方法,为了去除重复而做的.要这样的话直接: SQL = "Select distinct b.Perid,b.Name,B.Sex,I.Edu,I.xueli,w.company,w.memo From (Base as b left join Info as i on i.perid=b.perid) left join work as w on i.perid=w.perid Where Len(I.Name)>0 And w.Memo Like '%"&Key&"%' 得了
xcwwhr 2012-11-13
  • 打赏
  • 举报
回复
引用 11 楼 xuguv 的回复:
LZ,你把现在查询的结果作为一个临时表,再 select distinct name from 临时表. 如果怕 把重名的过滤了,那么 在生成临时表的时候,把perid 写成 convert(varchar perid) 然后 distinct perid
请问代码怎么写了?
xb12369 2012-11-13
  • 打赏
  • 举报
回复
發糞塗牆 2012-11-12
  • 打赏
  • 举报
回复
不是这个问题,如果你要限定只有一条,那可能展示的时候一个人多个工作经历要打横来显式,或者值显式某个时期的数据,不然肯定有多条。
开启时代 2012-11-12
  • 打赏
  • 举报
回复
select a.perid,a.name,a.sex,edu,xueli from base as a inner join INFO as b on a.perid=b.perid where a.perid in (select perid from WORK where memo like '%电气%')
xcwwhr 2012-11-12
  • 打赏
  • 举报
回复
能否给一个分析后的sql代码来参考测试一下了?
摇滚雪碧 2012-11-12
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
首先要考虑表关系,如果你的主键是组合主键,但是在关联的时候没有都写上,那么就会产生重复或者怪异的数据,单纯distinct或者group by不应该作为首要的解决方法。
分析的很对,表关系的约束条件写的不够详细,如果写详细work表中包含“电气”对应的学生信息不会出现重复的
發糞塗牆 2012-11-12
  • 打赏
  • 举报
回复
测试了一下,除非你的展示格式变化,或者还有其他键作为符合主键,不然的确会重复。distinct报错是因为你有ntext值,不能distinct
开启时代 2012-11-12
  • 打赏
  • 举报
回复
Select distinct b.Perid,b.Name,B.Sex,I.Edu,I.xueli,w.company,cast(w.memo as varchar(max) memo From (Base as b left join Info as i on i.perid=b.perid) left join work as w on i.perid=w.perid Where Len(I.Name)>0 And w.Memo Like '%"&Key&"%'
xcwwhr 2012-11-12
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
首先要考虑表关系,如果你的主键是组合主键,但是在关联的时候没有都写上,那么就会产生重复或者怪异的数据,单纯distinct或者group by不应该作为首要的解决方法。
感谢您的分析,请问我的这一段sql代码该如何写了?
xcwwhr 2012-11-12
  • 打赏
  • 举报
回复
引用 1 楼 lixzhong 的回复:
Select distinct b.Perid,b.Name,B.Sex,I.Edu,I.xueli,w.company,w.memo From (Base as b left join Info as i on i.perid=b.perid) left join work as w on i.perid=w.perid Where Len(I.Name)>0 And w.Memo Like ……
感谢您的回复,我加distinct 运行后系统报错,提示“ntext 数据类型不能选为 DISTINCT,因为它不可比。“
發糞塗牆 2012-11-12
  • 打赏
  • 举报
回复
首先要考虑表关系,如果你的主键是组合主键,但是在关联的时候没有都写上,那么就会产生重复或者怪异的数据,单纯distinct或者group by不应该作为首要的解决方法。
开启时代 2012-11-12
  • 打赏
  • 举报
回复
Select distinct b.Perid,b.Name,B.Sex,I.Edu,I.xueli,w.company,w.memo From (Base as b left join Info as i on i.perid=b.perid) left join work as w on i.perid=w.perid Where Len(I.Name)>0 And w.Memo Like '%"&Key&"%'

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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