4

可能重复:
SQL 查询如何有两个 from 子句?

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

3 回答 3

1

第一个 from 是可选的,第二个不是。

例如你可以写

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

您注意到我如何在语句中嵌入选择,这使您可以通过仅从选择运行到查询结束来查看在运行报告之前将删除哪些记录

于 2012-12-14T20:42:26.030 回答
1

引用第二个FROM的文档:

FROM table_source

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

这个扩展,指定一个连接,可以用来代替 WHERE 子句中的子查询来标识要删除的行。

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

所以基本上它会按照锡上所说的那样做。您指定一个附加结果集,从中确定要在原始表中删除的数据。

于 2012-12-14T19:59:31.447 回答
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
于 2012-12-14T19:54:21.863 回答