SQL Server如何基于stock关联表删除items和box两张表的对应行
问题解决逻辑
首先你之前的查询逻辑存在错误,box.boxof not in (select ORDERNO from items) 这个条件不符合关联需求:你需要匹配的是box表的ORDERNO属于待删除items条目的ORDERNO,而非找boxof不在items表范围内的记录。
步骤1:先筛选待删除的box表数据(验证结果用)
使用关联查询匹配规则,加DISTINCT避免同一个ORDERNO对应多条items记录时重复返回box行:
SELECT DISTINCT box.BOX_ID, box.ORDERNO, box.BOX, box.BOXOF, box.LU_ON FROM box INNER JOIN items ON box.ORDERNO = items.ORDERNO INNER JOIN stock ON items.ITEM = stock.NUMBER WHERE items.LU_ON >= '2021-11-10' AND CONVERT(VARCHAR, stock.CUSTOMTEXT) = 'breakout' AND CONVERT(VARCHAR, items.ORDERNO) <> ''
确认返回的是你要删除的box条目后再执行删除操作。
步骤2:按顺序执行删除
注意必须先删box表数据,再删items表数据:如果先删除items,就无法通过关联关系筛选对应的box记录了
删除box表目标数据
DELETE FROM box WHERE BOX_ID IN ( SELECT DISTINCT box.BOX_ID FROM box INNER JOIN items ON box.ORDERNO = items.ORDERNO INNER JOIN stock ON items.ITEM = stock.NUMBER WHERE items.LU_ON >= '2021-11-10' AND CONVERT(VARCHAR, stock.CUSTOMTEXT) = 'breakout' AND CONVERT(VARCHAR, items.ORDERNO) <> '' )
删除items表目标数据
执行你原有的items删除语句即可:
DELETE FROM items WHERE items.item in ( SELECT stock.number FROM stock WHERE items.item = stock.NUMBER AND items.LU_ON >= '2021-11-10' AND CONVERT(VARCHAR, ORDERNO) <> '' AND CONVERT(VARCHAR, STOCK.CUSTOMTEXT) = 'breakout' )
注意事项
生产环境操作前建议先备份对应表数据,或开启事务执行删除,确认影响行数符合预期后再提交事务,避免误删数据。
内容的提问来源于stack exchange,提问作者YSD
相关产品推荐
相关产品推荐

