2012-12-14 82 views
4

可能重複:
How can a SQL query have two from clauses?爲什麼此刪除語句有效?

delete from machine_placement_group 
from (machine_group g 
left join config_chg_req r 
    on g.machine_group_id = r.machine_group_id) 
join machine_placement_group mg 
    on g.machine_group_id = mg.machine_group_id 

我不明白,這兩個從報表。

+4

是什麼RDBMS結束運行報告之前的記錄將被刪除你在用嗎? – Taryn

+1

對我來說看起來像SQL Server語法。 – Yuck

+2

@Yuck我從來沒有見過SQL Server語法,其中有兩個從子句中刪除 – Taryn

回答

0

我想這也可以寫成

delete machine_placement_group 
from machine_group g 
left join config_chg_req r 
    on g.machine_group_id = r.machine_group_id 
join machine_placement_group mg 
    on g.machine_group_id = mg.machine_group_id 

和作品像

Declare @Test Table (id int) 
insert into @Test values(1) 

delete dbo.Employee 
from @test g 
join dbo.Employee e on g.id=e.ID 

擬合加盟條件 像

一個有效的聲明,其中任何行從@Test刪除
delete dbo.Employee 
from @test g 
+0

我想我現在明白了。它將刪除machine_placement_group中的每一行,其中machine_group_id中的machine_group中有匹配的行,machine_group_id中的config_chg_req中有一行。如果相應的行在表b和c中退出,則刪除表a中的一行。我怎麼辦? – user1904985

1

要報價the documentation for t他第二 FROM:

FROM table_source

指定一個額外的FROM子句。 此DELETE的Transact-SQL擴展允許 從第一個FROM子句的表中指定<table_source>的數據和刪除表中相應的行的 。

可以使用指定聯接的擴展來代替WHERE子句 中的子查詢來標識要刪除的行。

欲瞭解更多信息,請參閱FROM (Transact-SQL).

所以基本上它做什麼,它在錫說。您可以指定一個附加結果集,從中確定原始表中要刪除的數據。

1

第一個是可選的,第二個不是。

例如,你可以寫

delete from table1 where id = 10 

delete table1 where id = 10 

但是,如果你要加入到其他表,因爲這查詢你需要的第二個FROM。

我喜歡這種東西的首選樣式是使用別名,所以我會寫。

delete g 
--select * 
from machine_group g 
left join config_chg_req r 
    on g.machine_group_id = r.machine_group_id 
join machine_placement_group mg 
    on g.machine_group_id = mg.machine_group_id 

你注意我如何嵌入選擇在聲明中,這可以讓你看到你運行剛剛從選擇查詢

相關問題