T-SQL:select要通过连接删除的行
场景:
比方说,我有两个表,TableA和TableB。 TableB的主键是单个列(BId),并且是TableA中的外键列。
在我的情况下,我想删除TableB中与TableB中的特定行链接的所有行:我可以通过连接吗? 删除从连接拉入的所有行?
DELETE FROM TableA FROM TableA a INNER JOIN TableB b ON b.BId = a.BId AND [my filter condition]
还是我被迫这样做:
DELETE FROM TableA WHERE BId IN (SELECT BId FROM TableB WHERE [my filter condition])
我想问的原因在于,在处理大型表格时,第一种select会更有效率。
谢谢!
DELETE TableA FROM TableA a INNER JOIN TableB b ON b.Bid = a.Bid AND [my filter condition]
应该工作
我会用这个语法
Delete a from TableA a Inner Join TableB b on a.BId = b.BId WHERE [filter condition]
是的你可以。 例如:
DELETE TableA FROM TableA AS a INNER JOIN TableB AS b ON a.BId = b.BId WHERE [filter condition]
正试图做一个访问数据库,发现我需要在删除后使用。
DELETE a.* FROM TableA AS a INNER JOIN TableB AS b ON a.BId = b.BId WHERE [filter condition]
在MySQL中它几乎是一样的,但是你必须在单词“DELETE”之后使用表别名 :
DELETE a FROM TableA AS a INNER JOIN TableB AS b ON a.BId = b.BId WHERE [filter condition]
上述语法在Interbase 2007中不起作用。相反,我不得不使用类似于:
DELETE FROM TableA a WHERE [filter condition on TableA] AND (a.BId IN (SELECT a.BId FROM TableB b JOIN TableA a ON a.BId = b.BId WHERE [filter condition on TableB]))
(注:Interbase不支持别名的AS关键字)
假设你有两个表,一个是Master集(例如Employees),另一个是子集(例如Dependents),你希望摆脱Dependents表中所有无法关键的数据行与主表中的任何行。
delete from Dependents where EmpID in ( select d.EmpID from Employees e right join Dependents d on e.EmpID = d.EmpID where e.EmpID is null)
需要注意的一点是,您只是首先从联接中收集EmpID的“数组”,使用该组EmpID在Dependents表上执行Deletion操作。
在SQLite中,唯一的工作是类似于beauXjames的答案。
它似乎归结于这个DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE);
并且可以通过SELECT对一些临时表进行筛选,并根据要删除表1中的logging的条件来JOIN可以筛选此临时表的两个表。
你可以运行这个查询:
Delete from TableA from TableA a, TableB b where a.Bid=b.Bid AND [my filter condition]
我正在使用这个
DELETE TableA FROM TableA a INNER JOIN TableB b on b.Bid = a.Bid AND [condition]
和@TheTXI的方式是好的,但我读了答案和评论,我发现有一件事情必须回答是使用条件在WHERE子句或作为连接条件。 所以我决定testing一下,写一个片段,但没有find有意义的区别。 你可以在这里看到sql脚本,重要的一点是我更喜欢把它写成commnet,因为这不是确切的答案,但它很大,不能放在评论中,请原谅。
Declare @TableA Table ( aId INT, aName VARCHAR(50), bId INT ) Declare @TableB Table ( bId INT, bName VARCHAR(50) ) Declare @TableC Table ( cId INT, cName VARCHAR(50), dId INT ) Declare @TableD Table ( dId INT, dName VARCHAR(50) ) DECLARE @StartTime DATETIME; SELECT @startTime = GETDATE(); DECLARE @i INT; SET @i = 1; WHILE @i < 1000000 BEGIN INSERT INTO @TableB VALUES(@i, 'nameB:' + CONVERT(VARCHAR, @i)) INSERT INTO @TableA VALUES(@i+5, 'nameA:' + CONVERT(VARCHAR, @i+5), @i) SET @i = @i + 1; END SELECT @startTime = GETDATE() DELETE a --SELECT * FROM @TableA a Inner Join @TableB b ON a.BId = b.BId WHERE a.aName LIKE '%5' SELECT Duration = DATEDIFF(ms,@StartTime,GETDATE()) SET @i = 1; WHILE @i < 1000000 BEGIN INSERT INTO @TableD VALUES(@i, 'nameB:' + CONVERT(VARCHAR, @i)) INSERT INTO @TableC VALUES(@i+5, 'nameA:' + CONVERT(VARCHAR, @i+5), @i) SET @i = @i + 1; END SELECT @startTime = GETDATE() DELETE c --SELECT * FROM @TableC c Inner Join @TableD d ON c.DId = d.DId AND c.cName LIKE '%5' SELECT Duration = DATEDIFF(ms,@StartTime,GETDATE())
如果你能从这个脚本中得到很好的理由,或写一个有用的,请分享。 谢谢,希望这个帮助。
更简单的方法是:
DELETE TableA FROM TableB WHERE TableA.ID = TableB.ID