sql去重常用的基本方法

sql去重常用的基本方法

1.存在两条完全相同的纪录

select distinct * from table(表名) where (条件)

2.存在部分字段相同的纪录(有主键id即唯一键)

如果是这种情况的话用distinct是过滤不了的,这就要用到主键id的唯一性特点及group by分组

例子:

        select * from table where id in (select max(id) from table group by [去除重复的字段名列表,..]

3.没有唯一键ID

m.*表示取m表的所有字段,然后其他的表不需要用到id,其他表只取特定字段,这样就不会发生id重复的问题了

例子:有成绩表和学生表

#成绩表
CREATE TABLE `SCORE` (
  `SNO` varchar(3) NOT NULL,
  `CNO` varchar(5) NOT NULL,
  `DEGREE` decimal(10,1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `SCORE` VALUES ('103','3-245',86.0),('105','3-245',75.0),('109','3-245',68.0),('103','3-105',92.0),('105','3-105',88.0),('109','3-105',76.0),('101','3-105',64.0),('107','3-105',91.0),('101','6-166',85.0),('107','6-106',79.0),('108','3-105',78.0),('108','6-166',81.0);


#学生表
CREATE TABLE `STUDENT` (
  `SNO` varchar(3) NOT NULL,
  `SNAME` varchar(4) NOT NULL,
  `SSEX` varchar(2) NOT NULL,
  `SBIRTHDAY` datetime DEFAULT NULL,
  `CLASS` varchar(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `STUDENT` VALUES ('108','曾华','男','1977-09-01 00:00:00','95033'),('105','匡明','男','1975-10-02 00:00:00','95031'),('107','王丽','女','1976-01-23 00:00:00','95033'),('101','李军','男','1976-02-20 00:00:00','95033'),('109','王芳','女','1975-02-10 00:00:00','95031'),('103','陆君','男','1974-06-03 00:00:00','95031');

需求是查询所有选修“计算机导论”课程的“男”同学的成绩表

如果使用select * from table的方式会出现重复字段

SELECT * FROM score a,student b
       WHERE a.sno = b.sno 
			 AND b.ssex='男' 
			 AND cno = (
			 SELECT cno FROM course WHERE cname='计算机导论'
			 )	

查询结果如下

在这里插入图片描述

解决方案就是按需查询:

m.*表示取m表的所有字段,然后其他的表不需要用到id,其他表只取特定字段,这样就不会发生id重复的问题了

SELECT b.*,a.cno,a.degree FROM score a,student b
       WHERE a.sno = b.sno 
			 AND b.ssex='男' 
			 AND cno = (
			 SELECT cno FROM course WHERE cname='计算机导论'
			 )		

查询结果如下

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用子查询或者CTE(公共表表达式)来实现。具体实现取决于你的数据结构和查询需求。以下是两种方法的示例: 1. 使用子查询 ``` SELECT DISTINCT column_name FROM ( SELECT column_name, CASE WHEN condition1 THEN value1 WHEN condition2 THEN value2 ELSE value3 END AS new_column FROM table_name ) AS subquery ``` 2. 使用CTE ``` WITH cte AS ( SELECT column_name, CASE WHEN condition1 THEN value1 WHEN condition2 THEN value2 ELSE value3 END AS new_column FROM table_name ) SELECT DISTINCT column_name FROM cte ``` 需要注意的是,在使用这些方法时,要确保列名和查询条件正确匹配,以及要遵循合适的SQL语法规则和最佳实践。 ### 回答2: SQL中的CASE WHEN语句用于在查询结果中根据条件进行判断并返回不同的结果。而"再去重"则是对查询结果进行去重操作。因此,"SQL CASE WHEN以后再去重"的含义是在使用CASE WHEN语句进行条件判断后,对查询结果进行去重操作。 具体而言,当我们在SQL查询中使用了CASE WHEN语句,根据不同的条件返回不同的结果时,查询结果中可能会出现重复的记录。为了避免重复的记录影响分析和后续处理,我们可以对查询结果进行去重操作。 在SQL中,常用去重方式有使用DISTINCT关键字和使用GROUP BY子句。DISTINCT关键字用于返回唯一的记录,即去除重复的记录;而GROUP BY子句一般与聚合函数一起使用,按照指定的列对结果进行分组,并返回每个组的聚合结果。 因此,当在使用CASE WHEN语句进行条件判断后,可以根据具体的需求选择使用哪种方式进行去重操作。例如,可以使用DISTINCT关键字对整个查询结果进行去重,或者使用GROUP BY子句按照某个列进行分组并进行去重。 总之,"SQL CASE WHEN以后再去重"指的是在使用CASE WHEN语句进行条件判断后,根据需求对查询结果进行去重操作,以得到需要的唯一记录。 ### 回答3: SQL中的CASE WHEN语句用于根据给定的条件执行不同的操作。而"再去重"表示在之前已经进行了一次去重,并希望在此基础上再次去重。 在SQL中,可以通过使用子查询来实现先通过CASE WHEN进行筛选,然后再进行去重的操作。以下是一个示例: ``` SELECT DISTINCT column_name FROM ( SELECT column_name, CASE WHEN condition1 THEN value1 WHEN condition2 THEN value2 ELSE value3 END AS new_column FROM table_name ) AS subquery ``` 在以上示例中,我们首先通过CASE WHEN语句将符合条件的值转换为新的列new_column。然后再使用SELECT DISTINCT语句对new_column进行去重,得到最终的结果。 通过这种方法,我们可以在进行CASE WHEN条件筛选后再进行一次去重。当然,具体的条件和表格结构会根据实际情况而有所不同,但基本思路是相似的。 需要注意的是,CASE WHEN语句和去重操作都会对查询的性能产生一定的影响。因此,在使用时需要根据实际需要进行权衡,并进行适当的优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值