如果所有记录都等于特定值,则从一个表中删除记录

Posted

技术标签:

【中文标题】如果所有记录都等于特定值,则从一个表中删除记录【英文标题】:Deleting records from one table if all records are equal to a specific value 【发布时间】:2020-09-22 15:36:52 【问题描述】:

学生桌

Student_ID  School          Home State  Grade      Age
85          Washington St   Colorado    Junior     22
90          Washington St   Washington  Senior     23
81          Oregon          California  Junior     21
21          Washington      Washington  Sophomore  21

考勤表

Student_ID  Active  Date
85          N       9/22/20
85          N       9/21/20
81          Y       9/22/20
81          N       9/21/20

如果我想通过查看谁仍然是活跃学生来清理包含学生信息的表,请在 Oracle 数据库中使用。通过在出勤表中按 Student_ID 排序,我想查找学生是否具有所有 active = 'N' 的值。如果每个学生活动的所有值 = 'N' 那么我知道他们不再是学生,我想从学生表(学生 85)中删除记录。但是,如果仅在每个学生的记录上具有 Active = 'Y',那么我不会删除该学生的任何内容,因为我知道他们仍然处于活动状态(学生 81)。最好的解决方法是什么,我尝试使用 all 运算符,但我一直无法获得所需的结果。以下是我一直在尝试使用的查询。

DELETE /*+ parallel (a) */ FROM STUDENT a 
WHERE ( a.student_ID  = ALL
(SELECT /*+ parallel (b) */ b.student_id, b.active FROM attendance b WHERE b.active = 'N')); 

【问题讨论】:

【参考方案1】:

一个选项使用not exists

delete from student s
where not exists (
    select 1 from attendance a where a.student_id = s.student_id and a.active = 'Y'
)

这也会删除根本没有出勤的学生。如果这不是您想要的,那么您可以使用相关子查询:

delete from student s
where (
    select min(active) from attendance a where a.student_id = s.student_id
) = 'N'

【讨论】:

【参考方案2】:

您可以使用聚合检查“Y”行:

DELETE 
FROM STUDENT
WHERE student_ID IN
 (
   SELECT student_id
   FROM attendance
   GROUP BY student_id
   HAVING MAX(active) = 'N' -- no Y for this student
 ); 

【讨论】:

【参考方案3】:
NOT Exists 

将是这里的最佳选择,因为猜测您必须处理一些巨大的桌子。 我第二次 GMB 的第一个查询。

【讨论】:

以上是关于如果所有记录都等于特定值,则从一个表中删除记录的主要内容,如果未能解决你的问题,请参考以下文章

如果numpy数组的所有元素都等于某个值,则从numpy数组中删除行/列

如果某个字段值出现在另一个表中,则从一个表中排除记录

数据库:表的插入,更新表中的数据记录,删除表中的数据记录

单击按钮时从 Access 数据库中删除特定记录

如果用户从表中删除记录,则刷新 Access 表单文本框

删除表的记录的sql命令是啥?