0

私の友人がテストでこれを見つけました、そして私はそれに戸惑います。カーソルを使用せず、個別でも、副選択でもありません。次のようなテーブルの2番目のコード「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行目はありません。結果セットを特定の順序(通常は要件ごと)に並べ替えてから、2番目の行を識別する必要があります。

したがって、このような質問には、代わりに決定的な答えがあります。

データが名前の昇順で並べ替えられている場合は、テーブルから2番目の「コード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 に答える