对于 SQL 用户,请注意你应该编写一个
DELETE
语句而不是SELECT
语句。运行脚本后,显示的答案是
Person
表。驱动程序将首先编译并运行您的代码片段,然后再显示Person
表。Person
表的最终顺序 无关紧要 。
这是题干的一部分,表明了他最后给的输出是修改后的Person表,也就是说你的所有select操作都不会有输出。然而对于使用delete语句来说,应该先使用select语句进行查询,在确认要删除的数据之后在进行delete操作,这样更加安全。但是本题不会把你select的结果展示给你,只能靠一直删除修改Person表来确定结果。真正操作数据库的时候可不会给你第二次删除的机会,删错了数据只能回滚了,非常麻烦。这里建议先在182的代码框里面敲select,感觉对了再去196里面敲delete
本题思路与181相似,也是一表分俩表两次查询,一个表查询重复的邮箱,将其命名为a;一个表查询首次出现的邮箱,也就是重复邮箱中id最小的那个邮箱,将其命名为b,然后我们可以写一个select语句:
select *
from person a,person b
where a.email = b.email
这样得到的是该表的 笛卡尔乘积 中的两个元素相等的有序对:
有什么用呢?哈哈,没用,只是将这个表内连接一下,也就是把a表和b表连接起来;
然后就是按照条件找到要删除的那条数据,条件是保留id最小的那条数据,也就是删除所有id较大的数据,所以要删的数据在a表中:
select a.*
from person a,person b
where a.email = b.email
and a.id > b.id
这样要删除的数据就找到了,将select改为delete就可以了,回到196试一下:
delete a
from person a,person b
where a.email = b.email
and a.id > b.id
这里delete后面那个a一定要写,不然它不知道要删那个表中的数据(因为前面我们已经分为两个表了)就会报错