Sql 删除删除的行数少于必须删除的行数

Sql 删除删除的行数少于必须删除的行数,sql,sql-server,tsql,join,sql-delete,Sql,Sql Server,Tsql,Join,Sql Delete,我的任务是根据我在多个列上连接的两个表之间的条件删除一个表中的行,因为没有主键或唯一键: 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 如果我只写这段代码: S

我的任务是根据我在多个列上连接的两个表之间的条件删除一个表中的行,因为没有主键或唯一键:

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条记录。产生这种差异的原因是什么?

产生这种差异的原因是连接可能会为rf中的给定行生成多行。即使SELECT返回这些行,也只删除一行

请注意,此逻辑不需要左连接,因为WHERE子句要求存在匹配项,从而将外部连接转换为内部连接

您可以使用EXISTS获得更准确的计数:


产生差异的原因是联接可能会为rf中的给定行生成多行。即使SELECT返回这些行,也只删除一行

请注意,此逻辑不需要左连接,因为WHERE子句要求存在匹配项,从而将外部连接转换为内部连接

您可以使用EXISTS获得更准确的计数:


这能治好吗?@Yana。删除操作是正确的。没有什么需要修复的。当我使用EXISTS编写问题的第二个查询时,我收到了不同的结果。对于这样的任务,EXISTS比join给出的答案更准确吗?@yana。exists仅对rf中的每一行计数一次。它不能产生重复项。@Yana。问题不是左连接,因为WHERE子句将其转换为内部连接。我试图在回答中解释这一点。这是可以解决的吗?@Yana。删除操作是正确的。没有什么需要修复的。当我使用EXISTS编写问题的第二个查询时,我收到了不同的结果。对于这样的任务,EXISTS比join给出的答案更准确吗?@yana。exists仅对rf中的每一行计数一次。它不能产生重复项。@Yana。问题不是左连接,因为WHERE子句将其转换为内部连接。我试图在回答中解释这一点。
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
             );