无法使用临时表和不在运算符中使用来删除特定记录

Unable to delete specific records using temp tables and using not in operator

create table demo11 (dn int, rn varchar(max))
insert into demo11 values(1,'A'),(1,'A-1'),(1,'A-3'),(2,'A'),(2,'B'),(2,'C'),(3,'A-3'),(3,'A-4'),(4,'A'),(4,'A-1'),(4,'A-2'),(4,'A-5')
    
    DROP TABLE #dnrn
    CREATE TABLE #dnrn(dn int,rn VARCHAR(MAX))
    insert into #dnrn(dn,rn)
    SELECT dn AS dn, MAX(rn) AS rn FROM demo11 GROUP BY dn
    SELECT * FROM #dnrn 
    delete from demo11 where dn NOT IN (SELECT dn FROM #dnrn) AND rn NOT IN (SELECT rn FROM #dnrn)
    SELECT * FROM demo11

尝试了上述查询,但没有得到想要的结果

预期结果:demo11 应该仅包含按 dn

分组的最大修订记录

输出应为:(1 A-3)、(2 C)、(3 A-4)、(4, A-5)

你在临时 table 中有来自 demo11 的每个 dn,因此 demo11 中的每一行的 dn NOT IN (SELECT dn FROM #dnrn) 都是假的,因此没有行得到已删除。

加入使用row_number() window 函数的派生table(不需要临时table)时,您可以实现您想做的事情为每个 dn 值的 rn 值分配数字,然后为该数字不是 1 的所有行分配数字,这指定最大值。

DELETE d
       FROM demo11 AS d
            INNER JOIN (SELECT dn,
                               rn,
                               row_number() OVER (PARTITION BY dn
                                                  ORDER BY rn DESC) r
                               FROM demo11) AS x
                       ON d.dn = x.dn
                          AND d.rn = x.rn
       WHERE x.r <> 1;