在 DELETE 语句中使用 FROM 关键字

Yar*_*lav 6 sql-server delete t-sql

BOL 和许多其他来源指出:

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

我习惯写DELETE没有FROM. 我进行了一些搜索,但找不到FROM强制性的地方。任何人都可以指出应该强制执行的情况吗?还是总是可选的?

Aar*_*and 14

这是一种情况,如果没有,就很难编写它:

DELETE /* FROM */ t1    -- this FROM is optional
  FROM dbo.t1           -- this FROM is mandatory
  INNER JOIN dbo.t2 AS t2
  ON t1.key = t2.key
  WHERE t2.key IN (1,2,3);
Run Code Online (Sandbox Code Playgroud)

或者:

DELETE /* FROM */ t1    -- this FROM is optional
  FROM dbo.t1           -- this FROM is mandatory
  WHERE EXISTS
  (
    SELECT 1 FROM dbo.t2
    WHERE key IN (1,2,3)
    AND key = t1.key
  );
Run Code Online (Sandbox Code Playgroud)

FROM在初始地点(例如DELETE **FROM** t1 FROM dbo.t1 ...)是可选的,就像联机丛书说。为什么你认为它应该是强制性的?借用托马斯的回答,他优雅地删除了,以下是相同的:

DELETE Sales.SalesOrderDetail WHERE SalesOrderID = -1;

DELETE FROM Sales.SalesOrderDetail WHERE SalesOrderID = -1;
Run Code Online (Sandbox Code Playgroud)

这类似于INSERT- 以下内容绝对 100% 等效,您无需编写INTO

INSERT dbo.t1(key) VALUES(1),(2),(3);

INSERT INTO dbo.t1(key) VALUES(1),(2),(3);
Run Code Online (Sandbox Code Playgroud)

  • @Yaroslav 不,`AS` 与它无关-事实是您要从连接或更复杂的表达式中删除而不仅仅是单个表。我已经更新了示例以显示这一点。 (2认同)