1

最小限のレコードを持つレコードを削除します。2 つのテーブル person (id, otherID) があります。otherID は他の person.id と film (id, country, personID) の参照です。ここで、personID は person.id の外部キーです。

personID と country に関連するレコードが最小限である映画テーブルのすべてのレコードを削除したいと考えています。例えば:

Person(1, 2)
Person(2, 2)
Person(3, 2)
Film(1, fr, 1)
Film(2, uk, 1)
Film(3, fr, 2)
Film(4, fr, 3)
Film(5, usa, 1)
Film(6, fr, 1)

Film(3, fr, 2) Person(1, 2 ) を削除する必要があります->国 fr, 2 の人物 1 の数が、同じ国の他の人物 2 (otherID 列) の数より多いためです。 fr',1.

Person(2, 2) 削除するものはありません

Person(3, 2) は、レコード Film(3, fr, 2) または Film(4, fr, 3) のいずれかを削除します。これは、どちらも国として fr を持ち、カウント = 1 であるが、レコードが Film(3, fr, 2) であるためです。前に削除されたので、Film(4, fr, 3) を保持する必要があります。

ここで、count = フィルムから count(*) を選択 (film.personID、film.country によるパーティション)

そしてキープ

Film(1, fr, 1)
Film(2, uk, 1)
Film(4, fr, 3)
Film(5, usa, 1)
Film(6, fr, 1)

実際には person テーブルの各レコードについて、以下を探します。

a = select count(*) over (partition person.id,film.country)

b = select count(*) over (partition person.otherID,film.country)

a と b の両方に同じ film.country を指定し、min(a,b) を持つレコードを削除します。

4

1 に答える 1

0

削除する行を識別するか、削除しない行を識別するクエリを記述でき、理想的にはROWIDのセットを返す場合は、次のようにするだけです。

Delete from my table where rowid in ( ...);

また

Delete from my table where rowid not in ( ...);
于 2012-05-25T08:29:34.197 に答える