【问题标题】:Delete multiple rows from a table (SQL)从表中删除多行 (SQL)
【发布时间】:2018-04-02 17:47:24
【问题描述】:

当我学习数据库系统的讲座时,我尝试了讲座幻灯片中提供的代码,但没有奏效。示例是从表中删除一些元组。

示例:从 Beers(name, manf) 中删除同一制造商的其他啤酒的所有啤酒。 幻灯片中提供的代码如下:

DELETE FROM Beers b  
WHERE EXISTS(    
   SELECT name  
   FROM Beers  
   WHERE manf = b.manf AND name <> b.name);

我创建 Beers 表并插入两行如下:

create table Beers(
    name CHAR(30) primary key,
    manf CHAR(30)
);

insert into Beers(name, manf)
values('Bud', 'A-B');

insert into Beers
values('Bud-lite', 'A-B');

并测试代码。根据讲座,它应该删除 Beers 中的所有元组,但是,代码不起作用并一直显示 “您不能在 FROM 子句中指定目标表 'Beers' 进行更新。当我在 SQL 上运行删除操作时。

谁能告诉我代码有什么问题?谢谢!

添加注释: 只是发现 MySQL 不能运行之前的代码,但可以运行这个:

Delete from Beers
where exists(
  select a.name from(select b.name from Beers b
                     where manf = b.manf AND name!= b.name) as a);

但我仍然不知道为什么我们需要在里面使用 select 两次。有人能解释一下这段代码是如何工作的吗?

【问题讨论】:

标签: mysql sql sql-delete delete-row


【解决方案1】:

在更新/删除期间在 mysql 中你不能使用同一个表,或者你可以使用 JOIN 来做同样的事情

DELETE a
FROM Beers a
JOIN Beers b ON a.manf = b.manf 
AND a.name <> b.name
/* WHERE a.manf = 'A-B' is not necessary */ 

DEMO

【讨论】:

  • 所以我们需要使用DELETE a FROM Beers a Join Beers b?我们可以只使用 DELETE FROM 吗?当我们应该使用 DELETE FROM 以及何时使用“DELETE A FROM ...”时,我仍然感到困惑。
  • 您只需告诉查询从哪个表中删除一条记录,如delete a from table a,其中a 是表的别名
  • 谢谢!您的代码有效!但是出于好奇,有没有什么方法可以修复讲师提供的原始代码?使用 WHERE EXISTS?
  • @tsen0406 。 . .您的原始代码是标准 SQL,几乎适用于所有数据库——除了 MySQL。
  • @GordonLinoff 谢谢!是的,我使用 MySQL。我修改了原始代码,它可以工作。但我仍然不太清楚为什么它可以工作(我更新了问题中的修改)......
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多