2017-10-21 233 views
2

当我正在学习数据库系统的讲座时,我尝试了演讲幻灯片中提供的代码,但没有工作。这个例子是从表中删除一些元组。从表中删除多行(SQL)

示例:从啤酒(名称,manf)中删除同一制造商生产的其他啤酒的所有啤酒。 而在滑动中提供的代码如下:

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

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

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'); 

和测试代码。根据讲座,它应该删除啤酒中的所有元组,但是,代码不工作,并保持显示 “您无法在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两次。有人可以解释这个代码是如何工作的吗?

+0

的可能重复做同样的[删除 - 我不能指定目标表?](https://stackoverflow.com/questions/5816840/delete-i-cant-specify-target-table) – Parfait

回答

2

在更新过程中的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

+0

所以我们需要使用删除一个从啤酒加入啤酒b?我们可以使用DELETE FROM吗?当我们应该使用DELETE FROM和'DELETE A FROM ...'时,我仍然感到困惑。 – tsen0406

+0

您只是告诉查询从哪个表中删除像'delete a from table a'这样的记录,其中a是给予表的别名 –

+0

谢谢!你的代码有效!但出于好奇,是否有任何方法来修复讲师提供的原始代码?使用WHERE EXISTS? – tsen0406