0

我的一个朋友在测试中发现了这一点,我对此感到困惑。不使用游标,也不区分,既不子选择,可以删除看起来像这样的表中的第二个代码“2” ?(最好用一个语句)

code  |  Name
--------------
   1  |  Name1
   2  |  Name2
   3  |  Name3
   1  |  Name1
   1  |  Name1
   2  |  Name2     <----delete this field
   3  |  Name3
4

1 回答 1

3

查看结果集,您可能会指着某物说“第二行”,但从技术上讲,没有这样的“保证”第二行。您需要能够按特定顺序(通常按要求)对结果集进行排序,然后确定第二行。

所以,像这样的问题,反而会有一个明确的答案。

当数据按名称升序排序时,从表中删除第二个“代码 2” 。(即使在这种情况下,当有多个代码为 2 且名称相同的行时该怎么办也存在问题)

--标识要删除的行。

select rowid from (
  select rowid, 
         rank () over (order by name asc) rnk --or dense_rank 
                                              --depending on requirement
  from   test_table
  where  code = 2
)where rnk = 2

--删除行,使用选定的rowid。

delete from test_table
where rowid in (
 <query above..>
};
于 2013-02-05T21:03:46.880 回答