日期:2014-05-16  浏览次数:20363 次

一道面试遇到的数据库题
table test

id name pass
1 aaa 111
2 bbb 222
3 ccc 333

insert into test(name,pass) select name,pass from test

table test

id name pass
1 aaa 111
2 bbb 222
3 ccc 333
4 aaa 111
5 bbb 222
6 ccc 333

去掉重复项

delete from test where id not in(select id from test group by name,pass);

delete from test where id not in (select * from (select * from test group by name,pass) a);

delete from test wehre not exists (select * from test group by name,pass);

三句语句只有第二句在mysql 中调试成功

其他的两条逻辑虽然清楚 但是还要在oracle 中测一下

我通过这个语句得到的提示是

select * from test group by name,pass 这句就可以得到不需要删除的语句

或者说除了这个语句查出来的其他的都是多余的.

测试得到 明显在ORACLE里这种方式行不通

有如下方法在ORACLE里可以实现

delete from test where id not in
(select min(id) from test group by name,pass)

用min();
1 楼 myaniu 2008-01-22  
http://dev.yesky.com/230/2669730.shtml
使用group by的话,须使用聚集函数。所以ORACLE里的那个写法正确。
其他非聚集字段都要放在group by 后面。
2 楼 mryangbing 2008-01-22  
各位学友:
    大家好!
     我也有一道关于数据库的问题: 我用润乾报表统计的时候,报这样的一个错误
: 数据集sxxx1的 sql异常:索引中丢失 IN 或 OUT 参数:: 1 错误来源: 索引中丢失 IN 或 OUT 参数:: 1

我润乾报表的SQL代码如下:

SELECT JLR ,EJLB,SUM(TO_NUMBER(SXSJ)) AS SXSJ
FROM  LAB_GZRZ_SXXX,LAB_GZRZ_SXLB
WHERE ((LAB_GZRZ_SXXX.SXLB_ID=LAB_GZRZ_SXLB.ID) AND ( LAB_GZRZ_SXXX.KSSJ>=? OR ? IS NULL) AND ( LAB_GZRZ_SXXX.KSSJ<=? OR ? IS NULL) AND (LAB_GZRZ_SXXX.CENTER_ID=? OR ? IS NULL) AND (LAB_GZRZ_SXXX.JLR_ZJH=? OR ? IS NULL) AND(LAB_GZRZ_SXXX.BUMENID=? OR ? IS NULL))
GROUP BY JLR ,EJLB
ORDER BY JLR ,EJLB

请各位帮忙,在此 我真诚的感谢
                                  谢谢!
祝大家: 新年快乐  工作顺利

3 楼 mryangbing 2008-01-22  
对了  我再补充上一句:  我用的润乾报表是3.5
用的数据库是Oracle
谢谢!!
4 楼 mryangbing 2008-01-22  
谢谢