DELETE 删除的行少于必须删除的行
DELETE removes less rows than it has to
我有一项任务是根据两个 table 之间的条件删除一个 table 中的行(我加入了多个列,因为没有主键或唯一键:
DELETE rf
FROM #tempTable rf
LEFT JOIN #tempTableInc rfi
ON rf.ID = rfi.ID
AND rf.Code = rfi.Code
AND rf.Type = rfi.Type
AND rf.Year = rfi.Year
WHERE rfi.Value != rf.Value
如果我只写这段代码:
SELECTrf.*, rfi.Value rfi
FROM #tempTable rf
LEFT JOIN #tempTableInc rfi
ON rf.ID = rfi.ID
AND rf.Code = rfi.Code
AND rf.Type = rfi.Type
AND rf.Year = rfi.Year
WHERE rfi.Value != rf.Value
我收到例如 30 条记录。当我把它写在 DELETE
语句中时,我只删除了 26 条记录。造成这种差异的原因可能是什么?
出现差异的原因是 JOIN
可能会为 rf
中的给定行生成多行。即使 SELECT
returns 那些行,也只有一个被删除了。
请注意,此逻辑不需要 LEFT JOIN
,因为 WHERE
子句要求存在匹配项,从而将外部联接变为内部联接。
您可以使用 EXISTS
获得更准确的计数:
SELECT rf.*
FROM #tempTable rf
WHERE EXISTS (SELECT 1
FROM #tempTableInc rfi
WHERE rf.ID = rfi.ID AND
rf.Code = rfi.Code AND
rf.Type = rfi.Type AND
rf.Year = rfi.Year AND
rfi.Value <> rf.Value
);
我有一项任务是根据两个 table 之间的条件删除一个 table 中的行(我加入了多个列,因为没有主键或唯一键:
DELETE rf
FROM #tempTable rf
LEFT JOIN #tempTableInc rfi
ON rf.ID = rfi.ID
AND rf.Code = rfi.Code
AND rf.Type = rfi.Type
AND rf.Year = rfi.Year
WHERE rfi.Value != rf.Value
如果我只写这段代码:
SELECTrf.*, rfi.Value rfi
FROM #tempTable rf
LEFT JOIN #tempTableInc rfi
ON rf.ID = rfi.ID
AND rf.Code = rfi.Code
AND rf.Type = rfi.Type
AND rf.Year = rfi.Year
WHERE rfi.Value != rf.Value
我收到例如 30 条记录。当我把它写在 DELETE
语句中时,我只删除了 26 条记录。造成这种差异的原因可能是什么?
出现差异的原因是 JOIN
可能会为 rf
中的给定行生成多行。即使 SELECT
returns 那些行,也只有一个被删除了。
请注意,此逻辑不需要 LEFT JOIN
,因为 WHERE
子句要求存在匹配项,从而将外部联接变为内部联接。
您可以使用 EXISTS
获得更准确的计数:
SELECT rf.*
FROM #tempTable rf
WHERE EXISTS (SELECT 1
FROM #tempTableInc rfi
WHERE rf.ID = rfi.ID AND
rf.Code = rfi.Code AND
rf.Type = rfi.Type AND
rf.Year = rfi.Year AND
rfi.Value <> rf.Value
);