Oracle去除重复列,并且对应行中其他字段只取一个值。

姓名 年龄
a 12
b 32
b 22
c 15
c 63
如何写sql语句使得查询出的结果为姓名列不重复,年龄取其中某一个值,明白?

SELECT
*
FROM
表名 main
WHERE
NOT EXISTS (
SELECT 1
FROM 表名 sub
WHERE main.姓名 = sub.姓名 AND main.年龄 < sub.年龄
)

算法是, 对于每一个 姓名, 仅仅检索出 年龄最大的那行数据.

( 这个 SQL 的缺点在于: 如果你有2行, 姓名一样, 年龄又最大的, 那么还是要出重复的 )追问

不错,虽然像你说的还不都完美,不过至少达到了我想要的目的,但这样的语句是怎么想出来的?能不能把您的思路说出来或者把语句的具体含义再给我们详细解析一下,让我们也深入理解一下。
还有就是什么样的工作(或公司)需要Oracle数据库的知识多一点?谢啦。

追答

这个 SQL 也是 在百度知道里面,从别人那里学习来的。
就是回答别人的问题的时候, 那个问题和你这个差不多的。

当时我嘛,也是写一个很长的 SQL
又是 MAX 又是 IN 的
后来有人就用上面那个 方式来回答了。
我就学习到了。

这就是在帮助别人的过程中学习, 帮助别人, 也是帮助自己。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-01
如果对“某一个值”没有特殊逻辑要求的话,可以用这个sql:
select distinct 主表.姓名,(select 别名.年龄 from 表名 as 别名 where 别名.姓名= 主表.姓名 and rownum=1)
from 表名 as 主表
如果要其它逻辑,在别名所在的查询,增加条件追问

如果我再加一个密码字段,现在想把密码字段也查出来是不是应该这样写:
select distinct 主表.姓名,(select 别名.年龄,别名.密码 from 表名 as 别名 where 别名.姓名= 主表.姓名 and rownum=1)
from 表名 as 主表

追答

不可以,可以写成
select distinct 主表.姓名,(select 别名.年龄||','||别名.密码 from 表名 as 别名 where 别名.姓名= 主表.姓名 and rownum=1)
from 表名 as 主表

第2个回答  2018-04-23
-- 姓名name 年龄age 表名student
select name, max(age) from student group by name;

相似回答