【问题标题】:DELETE removes less rows than it has toDELETE 删除的行数少于必须删除的行数
【发布时间】:2021-02-17 03:39:58
【问题描述】:

我的任务是根据两个表之间的条件删除一个表中的行(我加入多个列,因为没有 PRIMARY 或 UNIQUE KEY:

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 条记录。造成这种差异的原因可能是什么?

【问题讨论】:

    标签: sql sql-server tsql join sql-delete


    【解决方案1】:

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

    请注意,此逻辑不需要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
                 );
    

    【讨论】:

    • 这可以修复吗?
    • @Yana 。 . . DELETE 正在做正确的事情。什么都不需要修复。
    • 当我使用EXISTS 从我的问题中编写第二个查询时,我收到了不同的结果。对于这样的任务,EXISTS 给出的答案是否比加入更准确?
    • @yana 。 . . exists 只计算rf 中的每一行一次。它不能产生重复。
    • @Yana 。 . .问题不在于LEFT JOIN,因为WHERE 子句将其变成INNER JOIN。我试图在答案中解释这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多