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 是如何直接删除的,不需要连接
查询
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 是如何直接删除的,不需要连接