为什么这个删除语句有效?

时间:2012-12-14 19:28:40

标签: sql sql-server sql-server-2008-r2 delete-row

  

可能重复:
  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

我不明白这两个陈述。

3 个答案:

答案 0 :(得分:1)

引用{em>第二个 FROM:

the documentation
  

FROM table_source

     

指定其他FROM子句。 DELETE的Transact-SQL扩展允许    从<table_source>指定数据并删除    第一个FROM子句中表的相应行。

     

可以使用此扩展指定连接,而不是WHERE子句中的子查询    识别要删除的行。

     

有关详细信息,请参阅FROM (Transact-SQL).

所以基本上它就像它在锡上说的那样。您可以指定另一个结果集,从中确定要在原始表中删除的数据。

答案 1 :(得分: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

您注意到我如何在语句中嵌入一个选择,这样您就可以通过从Select运行到查询结尾来查看在运行报表之前将删除哪些记录

答案 2 :(得分: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

删除任何行FROM @test以适合连接条件 像

delete   dbo.Employee 
from  @test g