T-SQL:选择要通过连接删除的行

Joh*_*ohn 486 t-sql join

场景:

假设我有两个表,TableA和TableB.TableB的主键是单列(BId),是TableA中的外键列.

在我的情况下,我想删除TableA中与TableB中的特定行链接的所有行:我可以通过连接执行此操作吗?删除从连接中提取的所有行?

DELETE FROM TableA 
FROM
   TableA a
   INNER JOIN TableB b
      ON b.BId = a.BId
      AND [my filter condition]
Run Code Online (Sandbox Code Playgroud)

或者我被迫这样做:

DELETE FROM TableA
WHERE
   BId IN (SELECT BId FROM TableB WHERE [my filter condition])
Run Code Online (Sandbox Code Playgroud)

我问的原因是在我看来,在处理较大的表时,第一个选项会更有效.

谢谢!

The*_*TXI 710

DELETE TableA
FROM   TableA a
       INNER JOIN TableB b
               ON b.Bid = a.Bid
                  AND [my filter condition] 
Run Code Online (Sandbox Code Playgroud)

应该管用

  • 我认为因为你必须指出从哪个表中删除记录.我刚刚使用语法`DELETE TableA,TableB ...`运行了一个查询,并且实际上删除了两者的相关记录.尼斯. (65认同)
  • @Andrew,请记住,这在T-SQL中不起作用. (15认同)
  • 一个问题.为什么我们需要编写'DELETE TableA FROM'而不是'DELETE FROM'?我看到它只适用于这种情况,但为什么呢? (10认同)
  • 在MySQL中,你会收到错误"MULTI DELETE中的未知表'TableA',这是因为你声明了TableA(a)的别名.小调整:`删除一个FROM表一个内部联接表b b b.Bid = a.Bid和[我的过滤条件] (8认同)
  • 我在连接上使用了 And [我的过滤条件] 而不是 Where 子句。我想两者都可以,但是连接的过滤条件会限制连接的结果。 (2认同)
  • 在带有 join 的 PostgreSQL 语法中不起作用,但可以使用“using”关键字。`使用 TableB b 从 TableA a 中删除,其中 b.Bid = a.Bid 和 [我的过滤条件]` (2认同)

cms*_*sjr 260

我会使用这种语法

Delete a 
from TableA a
Inner Join TableB b
on  a.BId = b.BId
WHERE [filter condition]
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这对我来说也是首选.特别是在我需要实际加入同一个表的情况下(例如,用于删除重复记录).在这种情况下,我需要使用别名来删除我正在删除的"边",这种语法使我非常清楚我从重复别名中删除. (14认同)
  • 我也更喜欢这种语法,似乎在逻辑上更加有意义地发生了什么.另外,我知道你可以使用相同类型的语法进行更新. (7认同)

Dia*_*tis 29

是的你可以.示例:

DELETE TableA 
FROM TableA AS a
INNER JOIN TableB AS b
ON a.BId = b.BId
WHERE [filter condition]
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢用别名来引用第一行中的表.那就是"删除"而不是"删除表A".在您自己加入表格的情况下,它会清楚您要删除哪一方. (8认同)

小智 10

尝试使用访问数据库执行此操作,发现我需要在删除后立即使用.*.

DELETE a.*
FROM TableA AS a
INNER JOIN TableB AS b
ON a.BId = b.BId
WHERE [filter condition]
Run Code Online (Sandbox Code Playgroud)


Mic*_*ler 8

它在MySQL中几乎相同,但您必须在"DELETE"后面使用表别名:

DELETE a
FROM TableA AS a
INNER JOIN TableB AS b
ON a.BId = b.BId
WHERE [filter condition]
Run Code Online (Sandbox Code Playgroud)