gpt4 book ai didi

ios - 如何转换SQL语句“delete from TABLE where someID not in (select someID from Table group by property1, property2)

转载 作者:可可西里 更新时间:2023-11-01 05:03:45 25 4
gpt4 key购买 nike

我正在尝试将以下 SQL 语句转换为 Core Data:

delete from SomeTable
where someID not in (
select someID
from SomeTable
group by property1, property2, property3
)

基本上,我想检索并删除表中可能的重复项,如果 property1、property2 和 property3 等于另一条记录,则该记录被视为重复项。

我该怎么做?

PS:正如标题所说,我只是想把上面的SQL语句转换成iOS Core Data的方法,而不是试图对上面的SQL进行改进、更正或评论,那是越界了。

谢谢。

最佳答案

这听起来像是您要求使用 SQL 来实现您的目标。您的起始查询不会执行您所描述的操作,并且由于聚合子查询试图选择不是组函数的列,因此大多数数据库根本不会接受它。

更新

我最初以为请求是删除每个包含骗子的组的所有 成员,并相应地编写了代码。像 MySQL 那样重新解释原始 SQL 后,目标似乎是为 (property1, property2, property3) 的每个组合保留一个元素。我想这更有意义。这是执行此操作的标准方法:

delete from SomeTable st1
where someID not in (
select min(st2.someId)
from SomeTable st2
group by property1, property2, property3
)

通过使用 min() 聚合函数从每个组中选择一个特定的 someId 值来保留,这与原来的区别。这也应该有效:

delete from SomeTable st1
where someID in (
select st3.someId
from SomeTable st2
join SomeTable st3
on st2.property1 = st3.property1
and st2.property2 = st3.property2
and st2.property3 = st3.property3
where st2.someId < st3.someId
)

这两个查询将保留相同的行。我更喜欢第二个,尽管它更长,因为 NOT IN 运算符对于从一个大集合中选择少量元素有点麻烦。但是,如果您预计有足够多的行需要考虑缩放,那么您应该同时尝试这两种方法,或许还可以研究优化(例如,(property1, property2, property3) 上的索引)和其他替代方案.

但是,至于根据 Core Data 调用来编写它,我不认为您完全可以。 Core Data 确实支持分组,因此您可以编写 Core Data 调用,在第一个备选方案中执行子查询,并返回实体对象或它们的 ID,按照描述进行分组。然后您可以遍历这些组,跳过每个组的第一个元素,并为所有其余元素调用 Core Data 删除方法。详细信息超出了 SO 格式的范围。

不过,我不得不说,在 Core Data 中做这样的工作将比直接在数据库中做的成本,无论是在时间上还是在所需的内存上。然而,直接在数据库中执行它对 Core Data 等 ORM 框架并不友好。这种事情是您在使用 ORM 框架时选择的权衡之一。

我建议您尽量避免这样做。在 SomeTable(property1, property2, property3) 上定义一个唯一索引,并做任何你需要做的事情来避免尝试创建重复项或从(失败的)尝试中优雅地恢复。

关于ios - 如何转换SQL语句“delete from TABLE where someID not in (select someID from Table group by property1, property2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31543196/

25 4 0