首页 > 解决方案 > 如何只删除符合条件的行

问题描述

我有下面的查询,选择返回我要删除的行,但是当我运行整个查询时,天哪,它从表中删除了所有内容。

如何将删除更改为仅在 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');

我的主要问题是删除,我需要确保只删除选择返回的内容。

标签: sqlsql-server

解决方案


如果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


推荐阅读