Sql-Server

Sql Server 刪除語法

  • June 8, 2019

我最近遇到了一個我不知道的刪除語法。

delete #fooTbl from #fooTbl where attr ='some'

微軟官方文件指出:

DELETE FROM [database_name . [ schema ] . | schema. ] table_name    
[ WHERE <search_condition> ]   
[ OPTION ( <query_options> [ ,...n ]  ) ]
[; ]  

我對我寫的命令有些困惑:

  • delete 關鍵字之前的參數是什麼以及需要什麼(在我的範例中與表名一致)?
  • 最佳做法是什麼?

delete 關鍵字之前的參數是什麼以及需要什麼(在我的範例中與表名一致)?

由於您可以DELETE FROM使用INNER JOIN.

#footbl一個從inner join另一個表中刪除的簡單範例

DELETE FT
FROM 
#DifferentTable DT
INNER JOIN #fooTbl FT
ON DT.attr = FT.attr
WHERE FT.attr ='some';

而這會由於未指定要刪除的表而產生錯誤

DELETE  
FROM #DifferentTable AS  DT
INNER JOIN #fooTbl AS FT
ON DT.attr = FT.attr
WHERE FT.attr ='some';

消息 156,級別 15,狀態 1,第 45 行關鍵字“AS”附近的語法不正確。

這也有效

DELETE  #fooTbl
FROM #DifferentTable AS  DT
INNER JOIN #fooTbl AS FT
ON DT.attr = FT.attr
WHERE FT.attr ='some';

簡而言之,如果您要引用多個表,則需要指定要從中刪除的別名/表,但是當您只引用一個時,您不必這樣做。

最佳做法是什麼?

就最佳實踐而言,我認為這對單表來說並不重要。別名可用於更輕鬆地調整/重用腳本。


Microsoft 文件中的更多範例

D. 對一個表中的數據使用連接和子查詢來刪除另一個表中的行

兩次使用表名

DELETE FROM Sales.SalesPersonQuotaHistory   
FROM Sales.SalesPersonQuotaHistory AS spqh  
INNER JOIN Sales.SalesPerson AS sp  
ON spqh.BusinessEntityID = sp.BusinessEntityID  
WHERE sp.SalesYTD > 2500000.00;  

使用別名

DELETE spqh  
 FROM  
       Sales.SalesPersonQuotaHistory AS spqh  
   INNER JOIN Sales.SalesPerson AS sp  
       ON spqh.BusinessEntityID = sp.BusinessEntityID  
 WHERE  sp.SalesYTD > 2500000.00;  

兩者的目的完全相同。

引用自:https://dba.stackexchange.com/questions/240135