2017-10-21 152 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