标签:
这是java交流群里一个网友面试的时候发过来的笔试题,我觉得题目的假定条件应该是某个字母对应的最小数字只有一个。
思路第一步是查出一个子表s1: select name,min(number) from USERS group by name。当然这后面可以加having count(name)>1;我的解法是选择不加,意思就是就算一个字母对应一个数字,也把他给取出来放进这个子表中。
第二步就比较麻烦,怎么删除多余的元素呢?如果 用 delete from USERS where name in (select name from s1(子表的名字) )and number not in ( select number from s1)。这显然是不行的,因为没有number做到分表来比较,如果像a里面number为4的元素因为和c的最小数相等,就不会被删除。
关键是要分组比较
查看sql语句库,突然发现有一个concat关键词,concat(列名1,列名2)就是把列名1和列名2查出来之后组成一个新列名。正好用在这里,4,a 和4,c用number in 不好区分,4a和4c这个总归好区分了吧。
SELECT * FROM t_ss WHERE CONCAT(NAME,number) NOT IN (SELECT CONCAT(NAME,mn) FROM ((SELECT NAME,MIN(number)AS mn FROM t_ss GROUP BY NAME) AS s1))
注:我的表是t_ss,删除实验不可逆,用select是一样的
标签:
原文地址:http://www.cnblogs.com/chuliang/p/5857785.html