【问题标题】:Delete query is not working with order by for multiple columns删除查询不适用于多列的 order by
【发布时间】:2022-01-26 14:14:53
【问题描述】:
CREATE TABLE SAMPLE1
(
     CN VARCHAR(MAX),
     CR VARCHAR(MAX), 
     DN VARCHAR(MAX),
     DR VARCHAR(MAX),
     DMR VARCHAR(MAX)
)

INSERT INTO SAMPLE1 VALUES ('C1', 'A', 'D1', '--', '--')
INSERT INTO SAMPLE1 VALUES ('C1', 'B', 'D1', '-A', '--')
INSERT INTO SAMPLE1 VALUES ('C1', 'E', 'D2', '--', '--')
INSERT INTO SAMPLE1 VALUES ('C1', 'C', 'D1', '-A', '--')
INSERT INTO SAMPLE1 VALUES ('C1', 'D', 'D3', '--', '--')
INSERT INTO SAMPLE1 VALUES ('C1', 'F', 'D2', '--', '--')
INSERT INTO SAMPLE1 VALUES ('C1', 'F', 'D2', '-A', '--')

预期结果:

('C1', 'F', 'D2', '-A', '--') 

即来自 SAMPLE1 的最后一条记录。

我尝试了以下查询,但它不起作用:

DELETE t
FROM  
    (SELECT 
         ROW_NUMBER() OVER(PARTITION BY CN
                           ORDER BY CR, DR, DMR DESC) AS r
     FROM SAMPLE1) t
WHERE r > 1 

【问题讨论】:

  • SQL Server @TimBiegeleisen
  • “不起作用”是什么意思?你有错误吗?出乎意料的结果?不良行为?完全是其他的?
  • 这是一种危险的做法,请考虑在表中添加唯一的 id 或插入时间
  • 您想在排序的每一列上指定desc

标签: sql sql-server tsql sql-delete


【解决方案1】:

鉴于您使用的是 SQL Server,您可以将当前查询中的逻辑放入可删除的 CTE:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CN
                                 ORDER BY CR DESC, DR DESC, DMR DESC) rn
    FROM SAMPLE1
)

DELETE
FROM cte
WHERE rn > 1;

【讨论】:

  • 我想要最后一条记录 ('C1','F','D2','-A','--') 你的查询我得到 ('c1','A', 'D1','--','--')
  • 对不起...我猜你原来的 ORDER BY 逻辑是关闭的。看看更新的答案。
  • 他们问题中的代码使用了一个可删除的派生表,该表也是有效的,并且与可删除的 CTE 行为相同
  • @MartinSmith 作为背景,我不清楚 OP 是否存在语法问题,或者代码是否运行但结果错误。我假设是前者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多