ベストアンサー
自宅の住所が住んでいる場所を一意に識別するように、Oracle ROWID は、行がディスク上のどこにあるかを一意に識別します。 ROWIDの情報は、Oracleが行、ディスク番号、シリンダー、ブロック、およびブロックへのオフセットを見つけるために必要なすべてのものを提供します。
ROWID値いくつかの重要な用途があります。
- 単一の行にアクセスするための最速の方法です。
- テーブルの行がどのように格納されているかを示すことができます。
- これらはテーブル内の行の一意の識別子です。
Rowidをテーブルの主キーとして使用しないでください。たとえば、インポートユーティリティとエクスポートユーティリティを使用して行を削除して再挿入すると、そのROWIDが変更される場合があります。行を削除すると、OracleはそのROWIDを後で挿入された新しい行に再割り当てする場合があります。
ただし、選択でRowid疑似列を使用できます。 span>およびクエリのWhere 句では、これらの疑似列の値は実際にはデータベースに保存されません。 Rowid疑似列の値を挿入、更新、または削除することはできません。
回答
ROWIDは行の物理的な場所です。主キーのないテーブルがあるとします。したがって、このテーブルには重複する行が含まれる可能性があります。重複する行を削除し、その種類を1つだけ保持するにはどうすればよいですか?
Oracleは、主キーの一種の代替としてROWIDを提供しています。相関タイプのネストされたクエリを作成できます[(行のすべての列でグループ化し、内部クエリの各グループでMIN(ROWID)を取得し、グループごとに外部クエリのグループの他の行を削除します)] ..
例:
SQL> select * from employees;
SSN NAME
---------- ----------
1 john
1 john
2 john
2 john
10 sam
11 beth
11 beth
12 beth
8 rows selected.
SQL> delete from employees where ROWID NOT IN (select min(ROWID) from employees
group by ssn,name);
2 rows deleted.
SQL> select * from employees;
SSN NAME
---------- ----------
1 john
2 john
2 john
10 sam
11 beth
12 beth
6 rows selected.