Sql 存在于同一个 table 上,子查询删除所有记录?

Sql Exists on same table with sub query deletes all records?

查询

Delete from Image 
where Exists
(
  SELECT x.ImageId, ParentId, occurrences 
  from Image li 
  inner join 
  (
    SELECT  
      ImageId,    
      COUNT(*) occurrences
    FROM Image 
    GROUP BY ImageId
    HAVING COUNT(*) > 1
  ) x on li.ImageId = x.ImageId
)

数据

ImageId   ParentId
a         1
a         2
b         3
c         4

预期剩余结果

ImageId   ParentId
b         3
c         4

Exists函数中查询returns前两条ImageId相同的记录a.

当我运行整个删除查询时,不仅这两条记录被删除,而且整个table数据被擦除!???

我找到了这个 link:Delete row from table where match exists in second table

用户评论了这种棘手的情况,但评论对我没有帮助,因为解决方案似乎对我开放。

我该如何修复删除查询?

您的子查询不相关,因此它只是删除每一行,只要不相关的子查询中至少有一行。

无论如何都不需要连接,您只需要关联它即可。

DELETE FROM Image 
WHERE EXISTS (SELECT 1
    FROM Image li
    WHERE li.ImageId = Image.ImageId
    HAVING COUNT(*) > 1
);

然而,使用 window 函数可能更有效

DELETE FROM li
FROM (
    SELECT *,
      Count = COUNT(*) OVER (PARTITION BY li.ImageId)
    FROM Image li
) li
WHERE li.Count > 1;

注意派生的 table 是如何直接删除的,不需要连接