1

删除记录最少的记录,我有 2 个表 person (id, otherID) otherID 是其他 person.id 和电影 (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 作为国家并且 count = 1 但作为记录 Film(3, fr, 2)之前被删除,因此必须保留 Film(4, fr, 3)。

其中 count = select count(*) over (partition by film.personID, film.country) from film

并保持

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 回答