2012-12-14 50 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 

你注意我如何嵌入选择在声明中,这可以让你看到你运行刚刚从选择查询

相关问题