当前位置: 首页 > 面试题库 >

删除除最近的记录以外的所有记录?

羊舌兴德
2023-03-14
问题内容

我有一对多关系的两个数据库表。数据如下所示:

select * from student, application

结果集:

+-----------+---------------+---------------------+
| StudentID | ApplicationID | ApplicationDateTime |
+-----------+---------------+---------------------+
| 1         | 20001         | 12 April 2011       |
| 1         | 20002         | 15 May 2011         |
| 2         | 20003         | 02 Feb 2011         |
| 2         | 20004         | 13 March 2011       |
| 2         | 20005         | 05 June 2011        |
+-----------+---------------+---------------------+

我想删除所有应用程序,但最新的除外。换句话说,每个学生都只能将一个应用程序链接到该应用程序。使用上面的示例,数据应如下所示:

+-----------+---------------+---------------------+
| StudentID | ApplicationID | ApplicationDateTime |
+-----------+---------------+---------------------+
| 1         | 20002         | 15 May 2011         |
| 2         | 20005         | 05 June 2011        |
+-----------+---------------+---------------------+

我将如何构造我的DELETE语句以过滤出正确的记录?


问题答案:
DELETE FROM student
WHERE ApplicationDateTime <> (SELECT max(ApplicationDateTime) 
                              FROM student s2
                              WHERE s2.StudentID  = student.StudentID)

考虑到评论中的长时间讨论,请注意以下几点:

上面的语句 在任何正确实现语句级读取一致性的数据库上运行,而不管语句运行时对表的任何更改。

我肯定知道即使对表 进行 并发修改也能正常工作的数据库:Oracle(此问题涉及的数据库),Postgres,SAP
HANA,Firebird(以及很可能使用InnoDB的MySQL)。因为它们都保证了在语句启动时的时间点上的数据具有一致的视图。改变<><不会为他们改变任何东西(包括Oracle此问题是关于)

对于上述数据库,语句 受到隔离级别,因为幻读或不可重复读只能之间发生 多次 陈述-而不是内的 单个 语句。

对于未正确实现MVCC并依赖于锁定来管理并发性(从而阻止并发写访问)的数据库,如果表被并发更新,则实际上可能会产生错误的结果。对于那些解决方法<,可能需要使用。



 类似资料:
  • 问题内容: 我有一个这样的表: 我正在尝试删除具有3个以上具有相同ID的名称的记录,但要删除所有记录。因此,我试图得到这样的东西: 我不了解如何编写此查询。我已经达到了保留一个记录但没有记录阈值的程度: 给我: 有什么建议?哦,对了,我不在乎合并时会保留哪些记录。 问题答案: 您可以使用CTE做到这一点

  • 问题内容: 是否可以构建单个mysql查询(不带变量)以从表中删除所有记录,但最新的N(按ID desc排序)除外? 像这样的东西,只有它不起作用:) 谢谢。 问题答案: 您不能以这种方式删除记录,主要问题是您不能使用子查询来指定LIMIT子句的值。 这有效(在MySQL 5.0.67中测试): 中间子查询 是 必需的。没有它,我们将遇到两个错误: SQL错误(1093):您无法在FROM子句中指

  • 删除记录命令用于从数据库中完全删除一个或多个记录。 以下语句是命令的基本语法。 以下是有关上述语法中选项的详细信息。 - 指定如何锁定加载和更新之间的记录。有两个选项来指定默认和记录。 - 指定要返回的表达式而不是记录数。 - 定义要更新的最大记录数。 - 定义在超时之前允许更新运行的时间。 注 - 请勿使用删除“顶点”或“边”,因为它会影响图的完整性。 示例 让我们考虑在前一章中创建的表。 编号

  • RemoveResult remove(RemoveRequest request) 功能 删除某个表的一条记录,可以删除全部或者部分属性,也可以指定条件,当条件成立时才删除成功 消耗一个单位写配额,如果带了条件,还消耗一个单位读配额(另外如果创建了EAGER类型的二级索引,每个Eager二级索引需要1个额外读配额) 方法参数 request : RemoveRequest : required

  • 问题内容: 我正在使用Spring JPA存储库将Twitter推文保存在数据库中。鸣叫的日期在MySQL数据库中另存为Datetime。现在,我想删除所有超过一年的推文。我看到有功能,想到了类似的东西。我知道那不是正确的语法,但是我不知道该怎么做。这是我所拥有的: 编辑已解决: 仓库: 服务: 问题答案: 为此,您需要2个步骤。首先,您需要一个方法,该方法将要删除消息的日期作为参数,并且根本不需

  • 问题内容: 我有3个表MySQL(MyIsam): 如何删除所有没有消息也没有archivedMessage的用户? 问题答案: 您可以使用: