请问我要实现一个多表删除的功能,通过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学习资源
你的语句本质上等价于:
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秒钟的时间: 如何使用索引使其更快? 问题答案: 该索引可能会有所帮助,但是请记住,这里没有免费的午餐(必须维护索引,因此这会影响您的插入/更新/删除工作量): 现在,您的查询可以说: 如果您根据查询更改其中一些标志的值,则可以尝试将这些列添