sql - 如何根据两列相同的表数据从表中删除行?
问题描述
我有带有属性更改历史记录的表,如下所示:
| 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”子句中使用别名。
有什么办法可以用另一种方式做这件事吗?
解决方案
只需使用相关子查询而不是group by
:
DELETE FROM table1 pch
WHERE pch.version < (SELECT MAX(version) AS maxVer
FROM table1 pch2
WHERE pch.id = pch2.id
);
推荐阅读
- c++ - 转换 json 值会导致 std::domain_error
- regex - Silverstripe 4.7.3 htaccess 重定向问题
- javascript - 基于映射替换字符串中的某些值 - JS
- android - ZXingScannerView: java.lang.RuntimeException: Camera.release() 被调用后正在使用
- stata - 在 Stata 中,使用“over”估计 svy:对变量子集的比率
- c - scanf() 函数可以采用单个字符值吗?
- node.js - 在 https 中启动 Next.js 应用程序时出错
- java - JTable 在 JScrollPane 中不可见
- azure-devops - Azure DevOps - 收集在 PR 上“需要审阅者”以及哪些分支的存储库列表
- javascript - 如何使用 vanilla JavaScript 获取选定的日期值?