2011-11-04 50 views
9

這只是看起來那麼奇怪了吧:SQL查詢如何有兩個子句?

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

的#Common是一個臨時表,但它的其餘部分是沒有意義的我。你怎麼能有兩個從?請幫助noob out。

回答

12

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 
) 
+0

好答案,並感謝您的鏈接的項目。 – broke

2

可以約束集要通過多個表中刪除記錄。第二個from只爲您從中刪除的表生成別名C,並將其與表#common中的表加入,並僅刪除具有記錄的記錄#common

1

MSDN第二個從允許您創建一個篩選器,第一個中的相應行將被刪除匹配的位置。

在這種情況下刪除所有[GearsDev] [DBO]。[產品]且ItemNumber在#Common相應的行具有相同的值