oracle查询出现的重复记录怎么去除?

zhangbo198294 2008-05-08 10:12:46
table:sys_menu
id,menuname,parentID

查询后的列:id,menuname,parentID,parentName

查询的sql语句:select a.id,a.menuname,a.menuparent,b.menuname parentname from (select * from sys_menu connect by prior id = menuparent start with menuparent is null order by id) a,sys_menu b
where a.menuparent = b.id or b.menuparent is null

如过不加b.menuparent is null根数据就不能查询出来,加了就出现很多重复的数据. 请高手帮忙看看 我的SQL太烂了 呵呵 谢谢
...全文
10965 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
wflyxiaonian 2012-04-23
  • 打赏
  • 举报
回复
查询完放到一个表再distinct
zhouzzff1234 2012-04-23
  • 打赏
  • 举报
回复
三个表的数据,过滤不同表的重复数据怎么办?
cool326236882 2011-08-18
  • 打赏
  • 举报
回复
以前看过一个查询重复的SQL个人认为效率不错。。
select t.*, t.rowid
from table t
where t.rowid >= (select max(z.rowid)
from table z
where z.重复字段 = t.重复字段)
C736059314 2011-08-18
  • 打赏
  • 举报
回复
多匹配几个条件再 group by 就可以了
咖啡 2011-08-18
  • 打赏
  • 举报
回复
select id,menuname,menuparent,
(select menuname from sys_menu b where b.id = a.menuparent) parentname
from sys_menu;
king62059020 2009-01-06
  • 打赏
  • 举报
回复
正解已经有了,21楼地大哥说地太对了
俺来说说比解另类地解法吧
select a.id,a.menuname,a.menuparent,b.menuname parentname from
(select id,menuname,nvl(menuparent,id) menuparent from sys_menu) a,sys_menu b
where a.menuparent = b.id order by a.id,a.menuname

作人,要变通嘛
oracle_dba_11 2008-05-13
  • 打赏
  • 举报
回复
用distinct(id)不行吗?
xudaqing2008 2008-05-12
  • 打赏
  • 举报
回复
呵呵,這囘可以了吧,摟主!
xudaqing2008 2008-05-12
  • 打赏
  • 举报
回复
select a.id,a.menuname,a.parentID,b.menuname parentname
from (select * from sys_menu connect by prior id = parentID start with parentID is null order by id) a,sys_menu b
where a.parentID = b.id or (b.parentID is null and a.id = b.id)
order by a.id
zhangbo198294 2008-05-12
  • 打赏
  • 举报
回复
这是我的原始数据
ID MENUNAME MENUPARENT PATH
000102 系统用户管理 0001 /system/SysUserManage.action
0001 系统功能维护
000101 系统菜单管理 0001 ../system/sysMenuManage.action
000103 组织机构管理 0001 SysGroupManage.action
000104 权限管理 0001
000105 数据字典管理 0001
000106 日志管理 0001 SysLogManage.action
0003 测试菜单
000301 test2 0003
000302 test3 0003
000303 test4 000302
000304 test5 000303
000305 test6 000304
000306 test7 000305
000307 test8 000306
000309 test9 000305
000310 test10 000309
0002 信息发布管理

加了group by还是不行
主要是根数据会重复
wangxiaoyes7816 2008-05-09
  • 打赏
  • 举报
回复
看下我的。思路一样
select views.*
from( select b.name,a.*,
row_number() over (partition by a.username order by a.changedate desc) rn
from maxuserstatus a,labor b where b.laborcode=a.username
) views
where views.rn=1
yun222222 2008-05-09
  • 打赏
  • 举报
回复
group by 分组一下
anglelwq 2008-05-09
  • 打赏
  • 举报
回复
我有几个例子 LZ可以参考一下 本人也经常用的


1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

3、查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)


5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
>select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

zhangbo198294 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xudaqing2008 的回复:]
ls這是你測試結果吧!
你測試數據呢(sys_menu原數據)
[/Quote]

测试结果跟上面是一样的 去掉重复的就是测试数据了
zhangbo198294 2008-05-08
  • 打赏
  • 举报
回复
上面的就是的 呵呵 
ID MENUNAME          MENUPARENT      PARENTNAME
0001 系统功能维护                  系统功能维护
000101 系统菜单管理       0001         系统功能维护
000102 系统用户管理       0001         系统功能维护
000103 组织机构管理       0001         系统功能维护
000104 权限管理         0001         系统功能维护
000105 数据字典管理       0001         系统功能维护
000106 日志管理         0001         系统功能维护
0002 信息发布管理                  系统功能维护
0003 测试菜单                    系统功能维护
0001 系统功能维护                  测试菜单
0002 信息发布管理                   测试菜单
0003 测试菜单                    测试菜单
000301 test2          0003         测试菜单
000302 test3          0003         测试菜单
000303 test4          000302        test3
000304 test5          000303        test4
000305 test6          000304        test5
000306 test7          000305        test6
000309 test9   000305 test6
000307 test8 000306        test7
000310 test10 000309        test9
0001 系统功能维护                  信息发布管理
0002 信息发布管理                  信息发布管理
0003 测试菜单                    信息发布管理
xudaqing2008 2008-05-08
  • 打赏
  • 举报
回复
不可能阿。
把你数据贴上来
zhangbo198294 2008-05-08
  • 打赏
  • 举报
回复
呵呵 谢谢楼上的朋友帮忙 但还是有重复的记录 就是parentID为空的数据重复了2次.全部数据为18条,parentID为空的数据有3条,现在查询后变成了24条


<HTML>
<HEAD>
<TITLE>PL/SQL Developer Export</TITLE>
</HEAD>
<BODY>
<TABLE BORDER="1">
<TR><TH>ID</TH><TH>MENUNAME</TH><TH>MENUPARENT</TH><TH>PARENTNAME</TH></TR>
<TR><TD>0001</TD><TD>系统功能维护</TD><TD> </TD><TD>测试菜单</TD></TR>
<TR><TD>0001</TD><TD>系统功能维护</TD><TD> </TD><TD>系统功能维护</TD></TR>
<TR><TD>0001</TD><TD>系统功能维护</TD><TD> </TD><TD>信息发布管理</TD></TR>
<TR><TD>000101</TD><TD>系统菜单管理</TD><TD>0001</TD><TD>系统功能维护</TD></TR>
<TR><TD>000102</TD><TD>系统用户管理</TD><TD>0001</TD><TD>系统功能维护</TD></TR>
<TR><TD>000103</TD><TD>组织机构管理</TD><TD>0001</TD><TD>系统功能维护</TD></TR>
<TR><TD>000104</TD><TD>权限管理</TD><TD>0001</TD><TD>系统功能维护</TD></TR>
<TR><TD>000105</TD><TD>数据字典管理</TD><TD>0001</TD><TD>系统功能维护</TD></TR>
<TR><TD>000106</TD><TD>日志管理</TD><TD>0001</TD><TD>系统功能维护</TD></TR>
<TR><TD>0002</TD><TD>信息发布管理</TD><TD> </TD><TD>测试菜单</TD></TR>
<TR><TD>0002</TD><TD>信息发布管理</TD><TD> </TD><TD>系统功能维护</TD></TR>
<TR><TD>0002</TD><TD>信息发布管理</TD><TD> </TD><TD>信息发布管理</TD></TR>
<TR><TD>0003</TD><TD>测试菜单</TD><TD> </TD><TD>测试菜单</TD></TR>
<TR><TD>0003</TD><TD>测试菜单</TD><TD> </TD><TD>系统功能维护</TD></TR>
<TR><TD>0003</TD><TD>测试菜单</TD><TD> </TD><TD>信息发布管理</TD></TR>
<TR><TD>000301</TD><TD>test2</TD><TD>0003</TD><TD>测试菜单</TD></TR>
<TR><TD>000302</TD><TD>test3</TD><TD>0003</TD><TD>测试菜单</TD></TR>
<TR><TD>000303</TD><TD>test4</TD><TD>000302</TD><TD>test3</TD></TR>
<TR><TD>000304</TD><TD>test5</TD><TD>000303</TD><TD>test4</TD></TR>
<TR><TD>000305</TD><TD>test6</TD><TD>000304</TD><TD>test5</TD></TR>
<TR><TD>000306</TD><TD>test7</TD><TD>000305</TD><TD>test6</TD></TR>
<TR><TD>000307</TD><TD>test8</TD><TD>000306</TD><TD>test7</TD></TR>
<TR><TD>000309</TD><TD>test9</TD><TD>000305</TD><TD>test6</TD></TR>
<TR><TD>000310</TD><TD>test10</TD><TD>000309</TD><TD>test9</TD></TR>
</TABLE>
</BODY>
</HTML>

xudaqing2008 2008-05-08
  • 打赏
  • 举报
回复
呵呵,搞定了
--------------------------------------------------------------------------
select a.id,a.menuname,a.parentID,b.menuname parentname
from (select * from sys_menu connect by prior id = parentID start with parentID is null order by id) a,sys_menu b
where a.parentID = b.id or (b.parentID is null and a.parentID is null)
zhangbo198294 2008-05-08
  • 打赏
  • 举报
回复
menuparent 是的 其实就是 parentID 我sql 语句里没有改过来
xudaqing2008 2008-05-08
  • 打赏
  • 举报
回复
menuparent到底是不是sysmenu的字段
加载更多回复(9)

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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