-
2021-05-05 03:41:01
今天在用Oracle分页查询数据的时候出现了重复数据,有的数据无法查出,很郁闷,想了想,找了资料,发现问题
分页语句:
select
*
from
( select
row_.*,
rownum rownum_
from
(
select bb.*from(
select
bw.id,
bw.nick_name,
bw.is_vip,
bw.fans_num,
bw.blog_num,
bwm.image_urls,
bwm.image_type
from
bw_user bw
left join
bw_userface_image bwm
on bw.headimgid=bwm.id ) bb
order by bb.fans_num desc ) row_
where
rownum <= 10
)
where
rownum_ > 0
这样查询的时候出现了重复数据
原因:fans_num 这个字段是不固定的,也就是说是动态的,随时都可能在改变,导致数据出现重复,如果这个字段是固定的,就不会出现重复数据
解决办法:如果不能确定排序字段是唯一的,必须添加另外一个排序字段,该字段最好是唯一索引键
select
*
from
( select
row_.*,
rownum rownum_
from
(
select bb.*from(
select
bw.id,
bw.nick_name,
bw.is_vip,
bw.fans_num,
bw.blog_num,
bwm.image_urls,
bwm.image_type
from
bw_user bw
left join
bw_userface_image bwm
on bw.headimgid=bwm.id ) bb
order by bb.fans_num desc ,bb.id desc
) row_
where
rownum <= 10
)
where
rownum_ > 0
在里面添加了id排序,id是主键,是唯一的,就不会重现重复数据了
注:如果排序的第一个字段(fans_num)改变的比较快,还是可能出现重复数据的,只是概率比较小
郁闷了一上午,终于知道弄出来了,以前排序都没注意到这个问题
更多相关内容 -
MYSQL双表查询时出现数据重复
2021-02-03 14:48:31今天在做双表查询的时候出现了同一条数据出现2次的问题(重复数据)。前景提要:A表和B表 A表中有A.sourseId。B表中也有B.sourseId。A表中有A.accountsetId。B表中也有B.accountsetId。a.assetCode = b.code 这个是两...今天在做双表查询的时候出现了同一条数据出现2次的问题(重复数据)。
前景提要:
A表和B表 A表中有A.sourseId。B表中也有B.sourseId。
A表中有A.accountsetId。B表中也有B.accountsetId。
a.assetCode = b.code 这个是两表之间的关联关系。
--------------------------分割线
因为SQL查询条件有2个条件,即sourseId = 某个值 , accountsetId = 某个值。
当SQL写成 :
select a.field1 , a.field2 , b.field1 , b.field2 from A as a , B as b where 1=1 AND a.assetCode = b.code AND a.sourceid = 值 AND a.accountsetid = 值 (也尝试了左连接版本的SQL)
都出现了这个问题 ~ 即结果集中 返回的数据有重复数据。
经过尝试,解决方案:
当查询条件的 a.sourceid 和 a.accountsetid 都从一个表中查询时,则会出现重复数据。
只需要把查询条件改成 b.sourceid ANDa.accountsetid 或者 a.sourceid AND b.accountsetid 即可。
select a.field1 , a.field2 , b.field1 , b.field2 from A as a , B as b where 1=1 AND a.assetCode = b.code AND a.sourceid = 值 AND b.accountsetid = 值
这样就好了。
MYSQL双表查询时出现数据重复
-
left join、right join、inner join关联查询时出现重复数据
2019-04-08 16:42:46先放一条 重复数据 的脏SQL SELECT O.ID AS ID,O.NAME AS NAME,COUNT(C.ID) AS CLASS_NUM FROM T_BASE_ORGANIZATION O LEFT JOIN T_XSXX_CLASSINFORMATION C ON O.ID = C.FACULTY_ID LEFT JOIN T_SZDW_...先放一条 重复数据 的脏SQL
SELECT O.ID AS ID,O.NAME AS NAME,COUNT(C.ID) AS CLASS_NUM FROM T_BASE_ORGANIZATION O LEFT JOIN T_XSXX_CLASSINFORMATION C ON O.ID = C.FACULTY_ID LEFT JOIN T_SZDW_CLASSMEETING_PLAN P ON C.ID = P.CLASS_ID WHERE C.GRADE = 2010 GROUP BY O.ID,O.NAME,O.ORDERS ORDER BY O.ORDERS
这表结构是:
T_BASE_ORGANIZATION 学院表
T_XSXX_CLASSINFORMATION 班级表
T_SZDW_CLASSMEETING_PLAN 班会表
一个学院 多个班级
一个班级 多个班会
总之引发查询出重复数据就是因为,表之间关联的关系不是一对一的而是一对多,从而导致数据重复。
解决方式方法一:在 GROUP BY 加上(多表的外键) C.ID SELECT O.ID AS ID,O.NAME AS NAME,COUNT(C.ID) AS CLASS_NUM FROM T_BASE_ORGANIZATION O LEFT JOIN T_XSXX_CLASSINFORMATION C ON O.ID = C.FACULTY_ID LEFT JOIN T_SZDW_CLASSMEETING_PLAN P ON C.ID = P.CLASS_ID WHERE C.GRADE = 2010 GROUP BY O.ID,O.NAME,O.ORDERS,C.ID ORDER BY O.ORDERS 方法二:在返回结果数据的 地方加上DISTINCT函数, COUNT(DISTINCT(C.ID)) SELECT O.ID AS ID,O.NAME AS NAME,COUNT(DISTINCT(C.ID)) AS CLASS_NUM FROM T_BASE_ORGANIZATION O LEFT JOIN T_XSXX_CLASSINFORMATION C ON O.ID = C.FACULTY_ID LEFT JOIN T_SZDW_CLASSMEETING_PLAN P ON C.ID = P.CLASS_ID WHERE C.GRADE = 2010 GROUP BY O.ID,O.NAME,O.ORDERS ORDER BY O.ORDERS 方法三:在做left join、right join、inner join的时候将 关联的表先DISTINCT(外键) 子查询一遍 SELECT O.ID AS ID,O.NAME AS NAME,COUNT(C.ID) AS CLASS_NUM FROM T_BASE_ORGANIZATION O LEFT JOIN T_XSXX_CLASSINFORMATION C ON O.ID = C.FACULTY_ID LEFT JOIN (SELECT DISTINCT(Z.CLASS_ID) FROM T_SZDW_CLASSMEETING_PLAN Z ) P ON C.ID = P.CLASS_ID WHERE C.GRADE = 2010 GROUP BY O.ID,O.NAME,O.ORDERS ORDER BY O.ORDERS
不推荐 使用方法一
ORDER BY 函数 影响范围广。
推荐使用方法一
子查询 作用范围小,不影响整体SQL。 -
多表联合查询导致的数据重复问题
2021-02-04 22:42:32message where id in(select message_id from message_message_tags where messagetag_id=62101) and (category=9 or category=1) order by (like_count+favorite_count) desc 原因是in子句的数据量大的话,性能就会...select id,like_count,favorite_count from message_message where id in(select message_id from message_message_tags where messagetag_id=62101) and (category=9 or category=1) order by (like_count+favorite_count) desc
原因是in子句的数据量大的话,性能就会非常低下。详见:
修改成多表查询:
select t1.sender_id,t1.id,t1.like_count,t1.favorite_count,t1.add_datetime from message_message t1, message_message2tag t2 where t1.id = t2.message_id and t2.tag_id=120560 and t1.category in (9,1) and t1.add_datetime>'2012-06-29' and t1.add_datetime < '2012-07-03' order by (like_count+favorite_count) desc limit 60
性能解决了,但发现有重复记录:
+----------+------------+----------------+-----------+---------------------+
| id | like_count | favorite_count | sender_id | add_datetime |
+----------+------------+----------------+-----------+---------------------+
| 33850491 | 2 | 220 | 471956 | 2012-06-29 20:42:47 |
| 33778187 | 14 | 167 | 122216 | 2012-06-29 12:24:15 |
| 33779339 | 8 | 165 | 122216 | 2012-06-29 12:33:57 |
| 34068745 | 0 | 112 | 3054 | 2012-07-01 15:00:26 |
| 33782239 | 4 | 94 | 116633 | 2012-06-29 12:58:23 |
| 33815718 | 2 | 92 | 4287 | 2012-06-29 17:10:13 |
| 33905850 | 3 | 87 | 85131 | 2012-06-30 10:36:39 |
| 33827272 | 1 | 75 | 171462 | 2012-06-29 18:21:31 |
| 33778798 | 7 | 69 | 122216 | 2012-06-29 12:29:38 |
| 33780283 | 8 | 64 | 122216 | 2012-06-29 12:42:15 |
| 33816638 | 0 | 59 | 4287 | 2012-06-29 17:16:16 |
122216一个会员发了多条记录,看来需要做distinct,直接把distinct加在字段前面是没有效果,可以通过结合子查询来和group来做,最终版:
select * from (select t1.sender_id,t1.id,t1.like_count,t1.favorite_count,t1.add_datetime from message_message t1, message_message2tag t2 where t1.id = t2.message_id and t2.tag_id=120560 and t1.category in (9,1) and t1.add_datetime>'2012-06-29' and t1.add_datetime < '2012-07-03' order by (like_count+favorite_count) desc limit 60) as t group by t.sender_id order by (like_count+favorite_count) desc;
这个人提到说通过
select *, count(distinct name) from table group by name来实现
http://hi.baidu.com/liveinyc/blog/item/facac543a2dc260b9213c658.html
分享到:
2012-07-04 16:03
浏览 18256
分类:数据库
评论
-
Oracle多表联查分页数据重复出现
2021-04-30 10:08:02一、问题描述使用Oracle的分页语句进行分页,第一页,没问题,第二页出现重复数据:第一页的数据:SELECT *FROM (SELECT u.*, rownum AS rFROM (SELECT configs.VIDEOSERVICE, configs.VOICESERVICE, configs.IMAGE... -
thinkphp中多表查询中防止数据重复的sql语句(必看)
2020-12-18 21:39:47下面先来看看例子: table id name 1 a 2 b 3 c 4 c 5 b 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。 select *, count(distinct name) from table group by name 结果: ...$ -
sql语句查询解决group by 统计重复数据问题个人总结
2020-12-14 12:30:49通常情况下我们写sql语句主键都是唯一的不会出现id重复的问题。如: 查询表table1的所有数据 select * from table1 会显示出table1中所有字段列表。 select count(*) as count from table1 统计table表中数据总数也... -
Mysql多表联查,查询结果出现重复的原因和解决方法
2021-11-09 19:31:49通过对该表以该字段查询后发现确实存在两行数据,换言之,如果在c表中查询该字段对应的数据后 即SELECT * FROM c WHERE c.network_id = '123456789'; 结果显示数据有n行,那么根据笛卡尔积,left join 将会产生m * ... -
多表连接查询使用了等值条件还是会出现重复的数据解决方法
2021-10-24 17:11:44多表连接查询数据出现重复数据 首先我们分析一下为什么会出现重复的数据 通过上面的图与分析,我们知道了问题的所在,接下来就是如何去解决问题 这里有好几种方法,我就简单的为大家说一下吧: ①、首先在... -
QueryDsl与SpringDataJPA实现分页级联查询出现重复数据
2019-10-31 19:58:55QueryDsl与SpringDataJPA实现分页级联查询出现重复数据欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表... -
解析mysql中:单表distinct、多表group by查询去除重复记录
2021-01-19 22:18:49单表的唯一查询用:distinct多表的唯一查询用:group bydistinct 查询多表时,left join 还有效,全连接无效,在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余... -
MySQL 多表关联一对多查询实现取最新一条数据的方法示例
2021-01-19 21:46:48多表关联一对多查询取最新的一条数据,数据出现重复 由于历史原因,表结构设计不合理;产品告诉我说需要导出客户信息数据,需要导出客户的 所属行业,纳税性质 数据;但是这两个字段却在订单表里面,每次客户下单... -
sql 多表联查 导致数据重复
2020-02-17 00:04:48但是community和region并没有关联 所以主表一条数据跟这两个表命中两次导致查询count数不对, 求大神们提供一些别的写法 ``` SELECT count( 1 ) sum, count(r.strCode), bc.strDistrict, bv.... -
MySQL联表查询数据重复
2021-08-03 23:12:22可以看到,这两次查询在联表时ON中的条件不一样,后面的多了一个筛选activity_id,如果不加这个条件的话,ON的时候主表与子表的记录不是一一对应的,会与本来我们不需要联表的数据进行联表,所以会产生很多虚假数据... -
多表关联出现重复数据原因
2017-04-11 17:34:00多表联合查询的时候,可能会产生多条重复数据,出现的原因: 1.可能是你用来进行 join的列,具有重复数据。 今天下午在写sql的时候,由于没有注意到该列的值并不是唯一的,所以导致查询出来的有N条重复数据 ... -
mysql一对多连表查询导致重复记录的解决方案
2021-07-15 11:16:01user表与user_book表的关系:一对多(通过user_book的userid外键关联) select user.*,user_book.* from user left join user_book on user.id=user_book.userid; 查询结果: user1对应了2条记录 select ... -
MySQL GROUP_CONCAT 多表查询出现重复数据
2020-11-26 17:06:33项目场景: 数据库查询语句是工作中经常用到的 问题描述: 多表关联查询时使用GROUP_CONCAT会有重复字段 如图: 解决方案: 加distinct去重 -
sql连接查询存在结果集重复
2020-07-01 18:06:16连接查询有时作为中间视图处理结果的语句,会由于数据集重复导致最终的数据统计结果不正确。 解决:必须确保连接条件的唯一性。 参考:https://www.cnblogs.com/lijingran/p/9001302.html 前置数据准备 商品表... -
SQL 查询重复数据,多字段联合重复
2019-06-01 09:47:40SELECT * FROM pagelist a WHERE ((SELECT COUNT(*) FROM pagelist WHERE ntitle = a.ntitle) >...--查询重复的数据 Delete from pagelist Where ID Not In (Select Max(ID) From pagelist Gr... -
SQL中出现重复 数据参照
2018-04-11 21:48:01问题描述:完工检验登记,出现重复数据问题分析:数据重复一般都是视图参照重复了,检查发现是cod7,send_fun_no=’XCBFP’这个条件造成了重复。应该是,之前形成报废通知单是根据总的报废数量形成的,而现在改成了... -
怎样从数据库中两个表查询不重复的数据
2021-01-21 03:07:17其实一个表这样就行selectdistinct第二列,第一列,第三列from表我实际的应用是查询两个表,找出两个表不重复的数据两个表关联查询我想用distinct,但是用不了(distinct不起作用)select...其实一个表这样就行select ... -
两个表联合查询去重复GROUP_CONCAT
2021-01-27 04:50:07例如 SELECT * as name FROM source mm LEFT JOIN ke ss ON mm.id=ss.tid 来查询,如果两个表有重复数据,这个时候,我们借助,一个mysql函数来实现首先我们要注意一点就是 group_concat(distinct ss.cname ... -
关于Hibernate查询出现重复数据的问题和解决方案
2014-10-29 17:06:03关于Hibernate查询出现重复数据的问题和解决方案 -
对于数据库 多表(左)连接 出现重复数据Java解决办法
2022-03-17 11:20:51对于数据库 多表(左)连接 出现大量重复数据 1. 解决办法 在ServiceImpl 中 去重 // start sart java8 新特性 需要的话 可以解除注释 List<Map<String, Object>> unique = dataModelList.stream().... -
sql 左连接数据出现重复
2020-10-26 20:33:35目录 一、简化举例 二、查询结果 一、简化举例 1、表aa ...二、查询结果 ...1、无条件查询 ...2、左链接查询 ...右表数据有重复时,连接关系如下 ...所以查询数据会出现重复,所以要保证右表所关联唯一 ... -
关于数据库多表关联查询时出现重复的记录应该怎样合并
2019-03-08 16:17:27今天在写多表关联查询的sql语句时,出现了查询出的记录有重复的现象,尽管更改了内联,左右外连接,还是会出现重复的记录,查询出的结果就像下面这样: 下面是我原来的sql语句: SELECT * FROM `students` a left ... -
深入理解SQL关联查询->关于重复数据
2019-04-10 15:10:00写出不必要的主键重复的数据说明你对业务或者SQL关联的理解有问题 SQL最重要的一块语法就是各种关联 inner join 和 left join 是最常用的 如果没能深入理解SQL查询 就会写出一些有重复的关联查询 1 select ... -
mysql 分页查询出现重复数据分析排查
2019-12-31 18:14:45mysql 分页查询出现重复数据问题排查mysql 分页查询出现重复数据问题分析定位问题解决方案 mysql 分页查询出现重复数据 2019的最后一天,才发现今年快过去了,就想着写点东西纪念一下,而且正好昨天项目上遇见一个让... -
left join关联查询一对多数据重复问题解决方案
2022-01-15 23:06:24在使用左右连接时,一定要保障主表与关联表的on条件是1:1的关系,以保障正常查询主表数据。 实例 # 车主表 create table owner ( id int(10) auto_increment primary key, owner_name varchar(10) null, brand_... -
ORCLE:inner join 和left join 解析 关联出现重复数据
2020-04-07 09:49:56test1(a,b)、test2(a,b) ...一、inner join:返回关联字段相等的记录 (一)1对1 test1: test2: select * from test1 a inner join test2 b on a.a=b.a (二)1对多 test1: test2: select * from test1...