当前位置: 首页 > 知识库问答 >
问题:

java - 如何在SQL中通过单一语句实现多表删除?

终睿
2024-08-08

请问我要实现一个多表删除的功能,通过dishID删除下面三张表中的相关记录,我下面的SQL问题在哪呢?
虽然我可以通过程序的逻辑解决这个问题,但是那样的话不够简洁,而且我相信一条SQL可以解决问题。

delete dish, dish_flavor, setmeal_dish
 from dish, dish_flavor, setmeal_dish  
where dish.id = dish_flavor.id and dish.id = setmeal_dish.id and dish.id in (51, 52);

执行结果:

Your call!
Query OK, 0 rows affected
Time: 0.002s

第三张表是空的,但是前两张表中的数据没有删除。

我做过的尝试:

1. 网上查询资料
2. chatgpt

希望获得的结果:

1. 知道我的sql问题在哪
2. 如何改正
3. 好的sql学习资源

共有1个答案

金令
2024-08-08

你的语句本质上等价于:

DELETE dish,
dish_flavor,
setmeal_dish 
FROM
    dish
    JOIN dish_flavor ON dish.id = dish_flavor.id 
    JOIN setmeal_dish ON dish.id = setmeal_dish.id 
WHERE 
    dish.id IN ( 51, 52 );

在第三张表没有符合条件的数据的情况下,由于不符合内连接的条件(筛选出来的记录要满足所有的连接条件,即三张表内都要有该ID的记录),所以没有一条记录会被删除
如果你想做到只要有任意表内有要删除的ID就进行删除,可以使用左连接:

DELETE dish,
dish_flavor,
setmeal_dish 
FROM
    dish 
    LEFT JOIN dish_flavor ON dish.id = dish_flavor.id
    LEFT JOIN setmeal_dish ON dish.id = setmeal_dish.id
WHERE
    dish.id IN ( 51, 52 );

这样就算第三张表没有数据,前两张表内的数据还是会被删除

 类似资料:
  • 问题内容: 我是LINQ的新手,我想知道是否可以从LINQ实现以下SQL查询? 我正在使用Entity Framework Core。 目前,我正在按以下方式使用FromSql来调用存储过程。我想知道是否可以在不使用存储过程的情况下做同样的事情? var result = context.MyData.FromSql(“ data.GetMyData @pType = {0},@ pLocatio

  • 问题内容: 说我想做,如何在同一个mysql_query()中做它们? 编辑: 由于这个问题有很多看法,我想指出,自PHP 5.5起,其他功能现在已被弃用,不应使用。 问题答案: 我从来没有尝试过,但是我认为您可以使用mysqli :: multi_query 。拒绝多条语句的好处之一是,它可以立即排除一些更常见的SQL注入攻击,例如添加一条语句。因此,您可能需要注意多个语句。

  • 问题内容: 我想在 Java中 执行查询。 我创建一个连接。然后,我想执行一条语句,完成后关闭连接,但是我想通过连接执行一些插入语句,并在循环完成后关闭连接。 我能做些什么 ? 我的示例代码是: 当执行select语句()时,循环必须为两次,但是当()执行并完成时,则关闭连接并从类中返回。 问题答案: 以下示例使用&命令同时执行多个SQL命令。 结果: 以上代码示例将产生以下结果。结果可能会有所不

  • 问题内容: 我想一次执行多个查询或作业。像这样的东西: 或多个选择查询。查询将是动态的。 但是我无法做到这一点,以半冒号分隔的多个查询的运行方式是什么? 问题答案: 您可以使用以下示例实现addBatch和executeBatch命令同时执行多个 SQL 命令。 批处理允许您将相关的SQL语句分组为一个批处理,并通过一次调用将其提交给数据库。参考 当您一次将多个SQL语句发送到数据库时,可以减少通

  • 问题内容: 我有一个脚本,该脚本必须查看超过250万条记录,以查找是否有未读电子邮件的成员。我想知道可以采取什么措施来提高其速度。目前,运行脚本最多可能需要8秒钟的时间: 如何使用索引使其更快? 问题答案: 该索引可能会有所帮助,但是请记住,这里没有免费的午餐(必须维护索引,因此这会影响您的插入/更新/删除工作量): 现在,您的查询可以说: 如果您根据查询更改其中一些标志的值,则可以尝试将这些列添

  • 问题内容: 我有一张调查答案表,类似: 并且我想创建一个查询,该查询将为我提供该表的结果摘要,从而允许我设置相关的日期范围。我下面的声明非常有效: 但是我不确定是否可以做得更好,以及在哪里添加日期范围过滤功能。 问题答案: 来自多刺的诺曼的第一个查询将给出这样的结果: 仅将几组不同的结果分组。我假设您想按问题将是/否的总数分类。在这种情况下,您必须执行以下操作: 结果:

  • 我有一个单向关系,其中一个实体有另一个实体的列表(一对多)。 我已将级联类型设置为级联类型。所有的,我得到了错误 在这条线上 我想更新现有的用户条目。如果我将上面的行替换为 它会创建重复条目。有什么解决办法吗。请帮帮我。我的代码: