SQL查询如何有两个from子句?

时间:2011-11-04 14:56:26

标签: sql sql-server sql-server-2008 tsql

这对我来说太奇怪了:

delete from GearsDev.dbo.Products 
from GearsDev.dbo.Products as C
inner join #Common as M
    on M.item = C.ItemNumber

#Common是一个临时表,但其余部分对我没用。

你怎么能有两个from条款?

3 个答案:

答案 0 :(得分:13)

DELETE的文档中可以看出,它可能需要两个FROM条款。

第一个FROM

  

FROM:   是一个可选关键字,可以在DELETE关键字和目标table_or_view_name或rowset_function_limited之间使用。

第二个FROM

  

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

     

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

因此,SQL将从Products表中删除与#common连接时具有匹配项的记录。

这与以下查询等效(含义):

delete from [GearsDev].[dbo].[Products]
where ItemNumber in
(
  select item from #common
)

答案 1 :(得分:2)

您可以通过多个表约束要删除的记录集。第二个from只为您删除的表生成别名C,将其与表#common连接,并仅删除记录为talbe #common的记录。 / p>

答案 2 :(得分:1)

MSDN第二个允许您创建一个过滤器,第一个来自相应的行将被删除,并匹配。

在这种情况下删除所有[GearsDev]。[dbo]。[Products]其中ItemNumber在#Common中具有相同的行,且具有相同值的项目