当时直接想到的是加DISTINCT进行去重,效果确实能够达到且立竿见影,除此之外,也可以在语句末尾添加group by b_id
来实现同样的效果。
但是不能只知其然,后来发现,是自己join的c表没有关联主键或者说是value唯一性的字段。
通过对该表以该字段查询后发现确实存在两行数据,换言之,如果在c表中查询该字段对应的数据后
即SELECT * FROM c WHERE c.network_id = '123456789';
结果显示数据有n行,那么根据笛卡尔积,left join 将会产生m * n条数据,会重复n倍。
使用多表联查时尽量关联到主键上或者具有唯一约束的字段上,或者可以习惯性的加上DISTINCT来进行查询结果的去重。
1 背景根据业务需要,需要使用如下的命令进行多表联查select a.id as a_id, b.id as b_id, b.protocol as protocol, b.priority as priority from (a, b) left join c on (a.network_id = c.network_id) where (a.id = b.acl_id and c.network_id = 'dec4f9c4-f562-451d-8edf-fce4284b7fa1')结果如
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
select * from testtable
where numeber in (select number from people group by number having count(number) > 1 )
可以查出testtabl
INSERT INTO hk_test(username, passwd) VALUES
('qmf1', 'qmf1'),('qmf2', 'qmf11')
delete from hk_test where username='qmf1' and passwd='qmf1'
MySQL里查询表里的重复数据记录:
先查看重复的原始数据:
场景一:列出username字段有重读的数据
select username,count(*) as count from hk_test group by username having count>1;
SELECT username,count
(整理不易,参考使用,记得点赞)
今天在写多表关联查询的sql语句时,出现了查询出的记录有重复的现象,尽管更改了内联,左右外连接,还是会出现重复的记录,查询出的结果就像下面这样:
下面是我原来的sql语句:
SELECT * FROM `students` a
left join clazz b on a.stuclazz = b.cid
inner join clazztime c on b...
中等难度笔试题,包括select / insert / update / delete 语法应用
多表联合查询,排序、分组等功能运用
包括但不限于MySQL,也可推广至Oracle、DB2等常见关系型数据库
考验的包括基本的CRUD水平,以及边界情况的判断处理
最常见的外连接发现重复数据的原因大多数是因为,两个表之间不是一对一关联,而是多对多,或者是一对多关联;这样查询连接的表越来越多的时候就会出现数据重复的情况
这种情况最好的解决方式便是找到产生重复数据的关联位置,将那个表的关联方式以及逻辑,尽可能的改成子查询,将无用的信息和混淆的信息尽可能的过滤,或者把条件从主查询放到子查询里面来缩小过滤重复数据;
例如:把where条件里面写上子查询
或者是在from里面写上子查询,让关联查询的表数据只关联我们需要的,或者关联不重复的数据。
我们先创建三个表,之后的查询均以这三个表为例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NbltapwW-1601602301029)(en-resource://database/1787:1)]
根据如图所示的字段及属性建立三张表,建立过程省略。注意sno,cno,在每张表中的格式要一致,就是我们所说的学号和课程号是固定的,一个学生只能有一个学号,一个课程只能有一个课程号。
插入后的数据格式如下(可以自行改变):
course:
score表:
stude
MySQL中多表联查可以使用JOIN关键字来实现。JOIN关键字包含多种类型,如INNER JOIN、LEFT JOIN、RIGHT JOIN等,这些类型都是用来描述关联方式的,下面以INNER JOIN为例:
SELECT *
FROM Table1
INNER JOIN Table2
ON Table1.id = Table2.id;
上述查询语句中,Table1和Table2是需要关联数据的两张表,ON后面的语句是关联条件,Table1.id = Table2.id表示根据id字段关联两张表。INNER JOIN表示使用内连接,只会返回两张表中有关联数据的行。如果需要返回所有数据,可以使用LEFT JOIN、RIGHT JOIN或FULL OUTER JOIN等其他类型的关联方式。
除了JOIN关键字,MySQL中还提供了子查询、UNION、INTERSECT和EXCEPT等多种方式实现多表联查。需要根据具体情境选择最合适的方式来实现。