一、有这样一张表,如下
temp:
id name address
1 福州市汽车站 五四路
2 福州市汽车站北站 五四路
3 福州市汽车站售票处 五四路
4 公厕 六一路
5 公厕 六一路
6 公厕 六一路
二、说明
如何实现自身表的不重复查询,我自己写了一个程序块如下:
declare
2 Cursor poiCur is select * from temp;
3 poirow temp%rowtype;
4 i integer;
5 begin
6 Open poiCur;
7 loop
8 Fetch poiCur into poirow;
9 select count(*) into i from temp where name like '%'||poirow.name||'%' and address=poirow.address;
10 if i>1 then
11 Dbms_Output.put_line('找到名称为:'||poirow.name||' 的数据,一共有:'||i||' 条
。');
12 end if;
13 Exit when poiCur%notFound;
14 End loop;
15 Close poiCur;
16 End;
结果是:
找到名称为:福州市汽车站 的数据,一共有:3 条
找到名称为:公厕 的数据,一共有:3 条
找到名称为:公厕 的数据,一共有:3 条
找到名称为:公厕 的数据,一共有:3 条三、问题
(1)查询"福州市汽车站"时的问题不大,但是当查询到“公厕”时,因为字段完全一样时就出现了重复,有没有办法的得不重复的结果?
(2)有没有更好的解决类似查询一张表中重复的数据,不一定时完全重复,也有可能时大部分重复,就像“福州市汽车站”这种情况?
temp:
id name address
1 福州市汽车站 五四路
2 福州市汽车站北站 五四路
3 福州市汽车站售票处 五四路
4 公厕 六一路
5 公厕 六一路
6 公厕 六一路
二、说明
如何实现自身表的不重复查询,我自己写了一个程序块如下:
declare
2 Cursor poiCur is select * from temp;
3 poirow temp%rowtype;
4 i integer;
5 begin
6 Open poiCur;
7 loop
8 Fetch poiCur into poirow;
9 select count(*) into i from temp where name like '%'||poirow.name||'%' and address=poirow.address;
10 if i>1 then
11 Dbms_Output.put_line('找到名称为:'||poirow.name||' 的数据,一共有:'||i||' 条
。');
12 end if;
13 Exit when poiCur%notFound;
14 End loop;
15 Close poiCur;
16 End;
结果是:
找到名称为:福州市汽车站 的数据,一共有:3 条
找到名称为:公厕 的数据,一共有:3 条
找到名称为:公厕 的数据,一共有:3 条
找到名称为:公厕 的数据,一共有:3 条三、问题
(1)查询"福州市汽车站"时的问题不大,但是当查询到“公厕”时,因为字段完全一样时就出现了重复,有没有办法的得不重复的结果?
(2)有没有更好的解决类似查询一张表中重复的数据,不一定时完全重复,也有可能时大部分重复,就像“福州市汽车站”这种情况?
解决方案 »
- Oracle创建一个表 如果不指定表空间 是不是就是用默认的system表空间
- EM 主机身份证明验证错误
- 按年度查询问题,各位大虾帮帮忙吧~!
- 如何查扎本年本月新增的数据,大大帮忙呀
- 用优化大师清理注册表后,Oracle不能用了,怎么解决?
- 两个有难度的分组,SQL语句(其实我不知道是不是真的有难度!)
- ▲▲出个有关SQL(ORACLE)的难题 ▲▲
- 看了3天的oracle,调试些小的sql语句,怎么感觉突然不知道下步该做什么拉,
- 如何限制两个字段的值相同
- 高手帮忙一下,在linux上安装oracle8.16,出现:ORA-12547:TNS:丢失联系 的错误 在线等待,50分
- 复制问题
- 程序包或函数f_getcblrsl处于无效状态!
if i>1 then 给屏蔽掉了,否则会输出:
找到名称为:福州市汽车站北站 的数据,一共有:1 条
找到名称为:福州市汽车站售票处 的数据,一共有:1 条
初步判断,你不应该使用loop和if。
declare
Cursor poiCur is select addres,min(name) as min_name from temp group by addres;
poirow temp%rowtype;
i integer;
begin
Open poiCur;
loop
Fetch poiCur into poirow;
select count(*) into i from temp where name like '%'||poirow.min_name||'%' and address=poirow.address;
Dbms_Output.put_line('找到名称为:'||poirow.min_name||' 的数据,一共有:'||i||' 条。'); Exit when poiCur%notFound;
End loop;
Close poiCur;
End;
select addres,min(name) as min_name from temp group by addres;
这个查询语句会导致结果不准确,
因为例如:表中有两个数据,name不同,但是address却相同,这样的话就会屏蔽name大的那个字段,而这两个字段并不是属于重复的。
1 福州市汽车站 五四路
2 福州市汽车站北站 五四路
3 福州市汽车站公厕 五四路
4 公厕 六一路
addres,min(name)范围剔除,之后再循环往复,直至记录=0。找高手吧!否则建议不要用存储过程了,后台代码实现判断还是比较好!