无法使用临时表和不在运算符中使用来删除特定记录
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;
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;