【问题标题】:Is there any way to combine the logic of these two sql delete operations?有没有什么办法可以结合这两个sql删除操作的逻辑呢?
【发布时间】:2019-03-28 13:48:46
【问题描述】:

我正在用 SQL 编写两个 DELETE 操作。第一个删除数据库中设置了学生角色名称的条目。第二个删除名称为null 的条目。我想知道我是否可以拥有一个可以处理这两种逻辑的 SQL 命令,还是需要将它们分开?

我有 4 张桌子 StudentClassStudent_RoleSignup。下面的删除将删除用户提供学生唯一 ID、班级唯一 ID 和学生角色名称的条目。

注册有 3 列(CLASS_ID、STUDENT_ID、STUDENT_ROLE_ID),它们都是外键

1st DELETE command:

DELETE S FROM SIGNUP S
INNER JOIN CLASS ON CLASS.ID = S.CLASS_ID
INNER JOIN STUDENT ON STUDENT.ID = S.STUDENT_ID
INNER JOIN STUDENT_ROLE ON STUDENT_ROLE.ID = SDR.STUDENT_ROLE_ID
WHERE CLASS.UNIQUE_ID = :classUniqueId AND
STUDENT.UNIQUE_ID = :studentUniqueId AND STUDENT_ROLE.NAME = :roleName

但如果我将null 传递给roleName,则此查询将不起作用。基本上我的第二个用例是我想删除一条记录,其中学生唯一 ID 和班级唯一 ID 与用户提供的内容匹配,但角色名称不存在。在这种情况下,它是null。所以我有另一个DELETE 针对这种情况的声明:

2nd DELETE command:

DELETE S FROM SIGNUP S
INNER JOIN CLASS ON CLASS.ID = S.CLASS_ID
INNER JOIN STUDENT ON STUDENT.ID = S.STUDENT_ID
WHERE CLASS.UNIQUE_ID = :classUniqueId AND STUDENT.UNIQUE_ID = :studentUniqueId
AND S.STUDENT_ROLE_ID IS NULL

现在我想知道是否可以将这两个组合成一个可以处理任一条件的语句(用户提供特定的学生角色 ID,或者角色 ID 是 null)最后,应该只删除一个条目。有没有办法做到这一点?

【问题讨论】:

  • “但是如果我为 roleName 传递 null,那么这个查询将不起作用。” AND STUDENT_ROLE.NAME <=> :roleName 应该可以解决问题吗? <=> 运算符是 MySQL 的 NULL 安全检查。

标签: mysql sql


【解决方案1】:

不确定我是否理解你,但也许这就是你想要的

DELETE S 
FROM   signup S 
       INNER JOIN class 
               ON class.id = S.class_id 
       INNER JOIN student 
               ON student.id = S.student_id 
       LEFT JOIN student_role 
              ON student_role.id = S.student_role_id 
WHERE  class.unique_id = :classUniqueId 
       AND student.unique_id = :studentUniqueId 
       AND ( ( :roleName IS NULL 
               AND S.student_role_id IS NULL ) 
              OR ( :roleName IS NOT NULL 
                   AND student_role.NAME = :roleName ) )

将 STUDENT_ROLE 从 INNER JOIN 更改为 LEFT JOIN,并在 where 子句中“忽略”STUDENT_ROLE.NAME 检查 :roleName 是否为 NULL。

【讨论】:

  • 对不起,我试图让我的问题尽可能清楚。我想这可能就是我要找的!我会试一试,如果它有效,我会回复评论
  • 似乎不起作用。这将删除角色名称为 null 和角色名称具有值的两个条目
  • @RonApple1996 我已经以可能对您有用的方式更新了答案。如果没有,您可以编辑您的问题以包括所有表的模式和每个表的记录样本。标记您要通过此查询删除的记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2022-08-11
  • 2020-07-13
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2017-12-11
相关资源
最近更新 更多