sql - 如何只删除符合条件的行
问题描述
我有下面的查询,选择返回我要删除的行,但是当我运行整个查询时,天哪,它从表中删除了所有内容。
如何将删除更改为仅在 where 之后删除 select 返回的行:
delete from StaffSecurityItems
WHERE exists (
SELECT ssi.SysSaffID
FROM StaffDeparment sd, CustomFieldValues cfv, StaffSecurityItems ssi
where cfv.SysCustomFieldID = '-9223372036854749962'
and cfv.FieldValue = 'Yes'
and sd.SysStaffRoleID =11
and cfv.SysDeparmentID = sd.SysDeparmentID
and ssi.SysSaffID = SysSaffID
and ssi.ItemName in ('EnrollNewMember','EditEnrollmentInfo')
and ssi.SysStudyID ='-9223372036854759558');
我的主要问题是删除,我需要确保只删除选择返回的内容。
解决方案
如果SELECT
可行,为什么不简单地替换SELECT
? 如果查询中的查询甚至返回单行(由于缺少相关查询,它找到的行是没有意义的),那么您所拥有的查询将删除表中的每一行。StaffSecurityItems
EXISTS
DELETE SD
FROM StaffDeparment sd
JOIN CustomFieldValues cfv ON cfv.SysDeparmentID = sd.SysDeparmentID
JOIN StaffSecurityItems ssi ON ssi.SysSaffID = sd.SysSaffID --guessed alias
WHERE cfv.SysCustomFieldID = '-9223372036854749962'
AND cfv.FieldValue = 'Yes'
AND sd.SysStaffRoleID =11
AND ssi.ItemName in ('EnrollNewMember','EditEnrollmentInfo')
AND ssi.SysStudyID ='-9223372036854759558'
而且,正如评论中提到的,ANSI-92 语法已经存在了 27 年!没有理由不使用它:要踢的坏习惯:使用旧式 JOIN