首页 > 解决方案 > 如何根据两列相同的表数据从表中删除行?

问题描述

我有带有属性更改历史记录的表,如下所示:

| id     | attr     | value  | version |
|--------|----------|--------|---------|
| UUID-1 | name     | chuck  | 1       |
| UUID-1 | password | morris | 1       |
| UUID-1 | name     | chack  | 0       |
| UUID-2 | name     | aron   | 2       |
| UUID-2 | name     | alan   | 1       |
| UUID-2 | name     | agor   | 0       |

现在我必须删除每个“id”的旧数据(应该保留 MAX(version) 的行),我想得到:

| id     | attr     | value  | version |
|--------|----------|--------|---------|
| UUID-1 | name     | chuck  | 1       |
| UUID-1 | password | morris | 1       |
| UUID-2 | name     | aron   | 2       |

所以,我决定我可以通过这样的结构来获得它:

DELETE
FROM
    table1 pch
WHERE
    EXISTS (
    SELECT
        id, MAX(version) AS maxVer
    FROM
        table1 pch2
    WHERE
        pch.id = pch2.id AND pch.version != maxVer
    GROUP BY
        id)

或类似的东西,但是...... oracle sql 不能在“where/have”子句中使用别名。

有什么办法可以用另一种方式做这件事吗?

标签: sqloracle

解决方案


只需使用相关子查询而不是group by

DELETE FROM table1 pch
WHERE pch.version < (SELECT MAX(version) AS maxVer
                     FROM table1 pch2
                     WHERE pch.id = pch2.id 
                    );

推荐阅读