oracle数据库,多条数据中有一个字段(name)有重复记录,但是其他字段不重复,怎么才能去重查询.

2024-10-30 00:34:16
推荐回答(5个)
回答1:

CREATE TABLE #test (
  ID    int,
  name  varchar(10),
  age   int
);
go


-- 用于测试 楼主的原始数据.
INSERT INTO #test
SELECT  1, 'tom',    22    UNION ALL
SELECT  2, 'tom',    23    UNION ALL
SELECT  3, 'tom',    24    UNION ALL
SELECT  4, 'lily',   22    UNION ALL
SELECT  5, 'lily',   23;

-- 用于测试 年龄不是按照大小顺序
INSERT INTO #test
SELECT  101, '张三',    23    UNION ALL
SELECT  102, '张三',    22    UNION ALL
SELECT  103, '张三',    21;

GO


-- 楼主的SQL
select * from #test where ID in(select max(t.ID) from #test t group by t.NAME)
GO

ID          name       age
----------- ---------- -----------
          3 tom                 24
          5 lily                23
        103 张三                  21

(3 行受影响)




-- 方法1:
SELECT
  *
FROM
  #test main
WHERE
  NOT EXISTS( select 1 FROM #test sub where main.name=sub.name AND main.ageGO

ID          name       age
----------- ---------- -----------
          3 tom                 24
          5 lily                23
        101 张三                  23

(3 行受影响)


-- 方法2:
select * from #test 
where  name + '.' + CAST(age as char) IN (SELECT name + '.' + CAST(MAX(age) as char) FROM #test GROUP by name);
GO

ID          name       age
----------- ---------- -----------
          3 tom                 24
          5 lily                23
        101 张三                  23

(3 行受影响)

回答2:

distinct去重复数据用

select id,distinct(name),age from table

参考http://baike.baidu.com/view/995053.htm

回答3:

楼下的回答很幼稚 测试了吗?
我帮你写下 把表名换一下就可以了
select max(ID) ID, name,max(age) age from tbname
group by name

为什么把问题搞的那么复杂 就这么简单的事情 写的越多越好吗?
楼主的那个方法也可以 (应该是巧合 如果你的年龄不是按照大小顺序的 你那个结果查询的就不是你要的)

回答4:

select id, name, max(age)
from table
group by name

很久不写SQL,语法都忘了。。。
GROUP BY 只能取两个字段,ID应该是主键吧?
如果是ORACLE 可以用ROW_NUMBER试试。
select * from (select ID ,NAME ,AGE,row_number() over(partition by NAME order by ID,AGE DESC) rn from TABLE ) where rn=1
我这没环境,要是有什么幼稚的错误自己改改吧,思路应该是这样。

你的追问是名字分组取出最大的ID,因为是唯一主键所以写的没错。如果你想把年龄作为条件加进去你的写法就有问题了。

回答5:

SELECT MAX(A.ID),A.NAME,B.MAG
FROM TABLE A,
(SELECT NAME,MAX(AGE) MAG FROM TABLE GROUP BY NAME) B
WHERE
A.NAME=B.NAME
GROUP BY A.NAME,B.MAG
你试下