Sql Server 删除语法

s.d*_*uro 6 sql-server delete t-sql

我最近遇到了一个我不知道的删除语法。

delete #fooTbl from #fooTbl where attr ='some'
Run Code Online (Sandbox Code Playgroud)

微软官方文档指出:

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

我对我写的命令有些困惑:

  • delete 关键字之前的参数是什么以及需要什么(在我的示例中与表名一致)?
  • 最佳做法是什么?

Ran*_*gen 7

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';
Run Code Online (Sandbox Code Playgroud)

而这会由于未指定要从哪个表中删除而产生错误

DELETE  
FROM #DifferentTable AS  DT
INNER JOIN #fooTbl AS FT
ON DT.attr = FT.attr
WHERE FT.attr ='some';
Run Code Online (Sandbox Code Playgroud)

消息 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';
Run Code Online (Sandbox Code Playgroud)

简而言之,如果您要引用多个表,则需要指定要从中删除的别名/表,但当您只引用一个时,则不必指定。

最佳做法是什么?

就最佳实践而言,我认为这对单个表并不重要。别名对于使适应/重用脚本更容易很有用。


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;  
Run Code Online (Sandbox Code Playgroud)

使用别名

DELETE spqh  
  FROM  
        Sales.SalesPersonQuotaHistory AS spqh  
    INNER JOIN Sales.SalesPerson AS sp  
        ON spqh.BusinessEntityID = sp.BusinessEntityID  
  WHERE  sp.SalesYTD > 2500000.00;  
Run Code Online (Sandbox Code Playgroud)

两者都服务于完全相同的目的。