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 关键字之前的参数是什么以及需要什么(在我的示例中与表名一致)?
由于您可以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 文档中的更多示例
两次使用表名
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)
两者都服务于完全相同的目的。