2016-09-23 75 views
1

在我的学生表中我有一些学生的信息。为什么我的独特功能在Oracle中不起作用?

id |phone  |name |age |sex 
---|-------------|------- |-------|------- 
1 |13553841211 |name1 |11  |1 
2 |13553841212 |name2 |12  |0 
3 |13553841213 |name3 |13  |1 
4 |13553841214 |name4 |14  |0 
5 |13553841214 |name5 |15  |1 

现在我想选择所有的信息。如果手机的计数大于1,我只想返回一个id为max的行。 我想要的结果:

id |phone  |name |age |sex 
---|-------------|------- |-------|------- 
1 |13553841211 |name1 |11  |1 
2 |13553841212 |name2 |12  |0 
3 |13553841213 |name3 |13  |1 
5 |13553841214 |name5 |15  |1 

我的代码是在这里,有什么不对?

select name,phone,id from student where 
id in (select max(id) from student having count(phone)>=1); 


select name,distinct(phone),id from student; 
+1

之所以你的代码不工作是因为'不同'适用于所有列选择列表。以你尝试过的方式将某些列从独特性中排除是没有意义的。相反,您需要确定每个电话号码具有最高ID的行,然后选择该行。有很多方法可以做到这一点,正如您提供的解决方案所示。哪一个性能最高的数据库和数据是由您来测试的。 – Boneist

+1

因为'distinct'是***不是***的功能。 –

回答

6

试试这个

select * 
from 
(
select name, id, phone, age, sex, row_number() over(partition by phone order by id desc) as stu_ord 
from student 
) 
where stu_ord = 1 
0

试试这个:

SELECT name,phone,id 
FROM student s1 
WHERE NOT EXISTS 
    (SELECT 'next' 
    FROM student s3 
    WHERE s3.phone = s1.phone 
    AND s3.id > s1.id) 
1

试试这个:

SELECT t1.* 
FROM STUDENT t1 
INNER JOIN (
    SELECT MAX(ID) as ID,phone 
    FROM student 
    GROUP BY phone 
)t2 
ON t1.ID =t2.ID 
+1

Thanks.It works.It should use on t1.ID = t2.ID,not WHERE t1.ID = t2.ID – Sarly

+1

t2需要该'max(id)'的别名或该连接不起作用 – JohnHC

+1

@JohnHC是的!更新了 –

相关问题