oracle 要查询 多个字段 但是要过滤掉 重复的数据 sql 语句怎么写啊 大神们 帮帮忙啊!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 要查询 多个字段 但是要过滤掉 重复的数据 sql 语句怎么写啊 大神们 帮帮忙啊!相关的知识,希望对你有一定的参考价值。

用 distinct 不行 应为有多个字段 所以 不管用
SELECT sequence_no, channel_id, base_id, product_mode,model_code,rated_voltage, spec, brand_name, show_flag, model_id FROM table_name where user_id=1

主要是想过滤model_id 这个字段的

distinct后面也可以跟多个字段啊
要么你用group by 但是group by和distinct的效果是一样的。追问

能举个 例子吗 亲

追答

SELECT DISTINCT COL1,COL2,COL3 FROM TABLE1
SELECT COL1,COL2,COL3 FROM TABLE1 GROUP BY COL1,COL2,COL3
上面两句的效果是一样的。

你又要在select中选取,又想distinct 这个是不符合逻辑的,因为除了model_id,其他字段的值是不一样的,distinct是把所有字段值相同的记录只筛选一条。

追问

那用group by 吗 ? 亲 把我 补充的那个 语句 给小弟我拼装一下吧

追答

SELECT sequence_no, channel_id, base_id, product_mode,model_code,rated_voltage, spec, brand_name, show_flag, model_id
FROM table_name
WHERE user_id=1
GROUP BY sequence_no, channel_id, base_id, product_mode,model_code,rated_voltage,
spec, brand_name, show_flag, model_id
GROUP BY 一般用于统计方面,比如你model_id=1一共有5条记录,然后select count(*) from table_name where user_id=1 group by model_id 返回的结果是5,类似count,sum,max这些函数后面就要跟上group by,否则用distinct就可以了。

追问

我不是要回去又多少条数 ,而是要取得每个字段的值啊!
ELECT sequence_no, product_mode,model_code,rated_voltage, spec, brand_name, show_flag, model_id FROM table_name WHERE user_id=1
GROUP BY sequence_no, product_mode,model_code,rated_voltage,
spec, brand_name, show_flag, model_id
并且过滤掉重复的数据 这样的我试过了 还是 不能过滤掉

追答

只有所有字段的值都相同才会过滤掉,你还没明白吗?
即使model_id一样其他字段值不一样,还是过滤不掉的
例如model_id sequence_no
1 1
1 2
1 2
1 3
select model_id,sequence_no from table_name where user_id=1 group by model_id,sequence_no
结果是
model_id sequence_no
1 1
1 2
1 3

参考技术A select distinct a,b,c from T;
是a,b,c组合值的不同,并不只是针对a.!
参考技术B 举个例子吧

mysql 查询

mysql 查询

 

1: Distinct

      有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能去重他的目标字段(即所有查询的字段)

注意: distinct必须放在要查询字段的开头

eg:

1:select distinct user_name from xxx 这样会过滤掉user_name 重复的,      

2:如果这样写: select  distinct id, user_name, password  from xxx    mysql会认为要过滤掉 id、user_name 、 password 都重复(完全一样)的,不然只要有一个字段不一样都会被查询出来;

注意:如果查询的有时间字段只有当时间的年月日时分秒都重复时才会被过滤掉

所以一般distinct用来查询不重复记录的条数。

如果要查询不重复的记录,有时候可以用group by 

2:order by 

注意:Mysql5.7及以上版本group by 子查询中order by 无效

如何解决?

1: 通过limit 语句使子查询的order by生效

但是这必须保证limit的数量,所以也可以使用DISTINCT实现。

 

3: group by

注意:使用group by 后默认返回的是每个组中id 最小的那一条记录

 

问题1:  对于mysql中的group by分组后如何获取组内创建时间最大(或最小)的那行数据 ?

以最大为例:

思路: 先对要查询的数据先进行降序排序,然后在使用group by 即可,但是会使用到子查询先排序(这里需要注意上面说到的order by)

 

SELECT
*
FROM(

SELECT
DISTINCT
*
FROM  a 
ORDER BY a.start_time DESC

) AS b
GROUP BY b.id

 

 

 

问题2:对一个结果集分组后怎么取每个分组的两条(或多条)最大(或最小)的数据?

取最大的两条:

SELECT 
* 
FROM student_score AS  a
WHERE (
 SELECT 
COUNT(*) 
FROM student_score AS b
    WHERE a.student_name=b.student_name AND a.score<b.score 
)<2
 
ORDER BY a.score DESC

取最小的两条:

 

SELECT 
* 
FROM student_score AS  a
WHERE (
 SELECT 
COUNT(*) 
FROM student_score AS b
    WHERE a.student_name=b.student_name AND a.score>b.score 
)<2
 
ORDER BY a.score DESC

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于oracle 要查询 多个字段 但是要过滤掉 重复的数据 sql 语句怎么写啊 大神们 帮帮忙啊!的主要内容,如果未能解决你的问题,请参考以下文章

mysql过滤重复数据的问题

JPA 查询部分字段

为啥要在字段上使用 LEFT JOIN,然后在 WHERE 子句中将其过滤掉?

Oracle通过一个字段的值将一条记录拆分为多条记录

Oracle多表关联如何更新多个字段

oracle 查询条件中判断两个字段相等时 一个字段为空则跳过