2013-01-03 30 views
1

我试图实现批量删除。 我发现在互联网上验证码:根据tableB上的数据从tableA批量删除

DECLARE @rowcount int = 1 
WHILE (@rowcount != 0) BEGIN 
    DELETE T1 
    FROM (SELECT TOP (50) * FROM Orders WHERE OrderCity = @city) T1 

    SELECT @rowcount = @@ROWCOUNT 
END 

的想法是从@city删除所有订单

这似乎很好地工作,但在我的现实,我需要delete from Orders where OrderCity in (select ID from SomeOtherTable)

如果我尽量做同样的事情,但它需要花费很多时间,因为SomeOtherTable将包含大约150万行并且数据正在从主表中删除,所以它不会变小(它不包含城市,它的另一个东西)。

我也不能加入这两个表,因为它不会运行,说多个表会受到影响。

所以基本上我的问题是:反正是有一批从表A,其中tableA.ID IN(从tableB的选择ID)

+1

如何使用CTE来选择SomeOtherTable所有ID(但只标识),然后通过内部与CTE加入从TableA中删除行?这样你就不会在两个表之间得到任何依赖关系。 –

+0

您是否尝试“从someOtherTable中明确选择ID”,如“从someothertable选择不同的ID”? – Kaf

+0

hi marceln。我用CTE得到相同的消息:视图或函数'T1'不可更新,因为修改会影响多个基表。 – Diego

回答

1

是的,你可以不用参加为:

DELETE tableA 
FROM tableB 
WHERE tableA.ID = tableB.ID 
+0

好吧,它可以作为一个去删除,但我想批量删除。你会怎么做? – Diego

+0

@Diego DELETE TOP(50)tableA FROM tableB WHERE tableA.ID = tableB.ID – bummi

+0

谢谢你,真的很有帮助。 – Diego

0
Delete Order 
FROM 
Order INNER JOIN SomeOtherTable ON Order.OrderCity = SomeOtherTable.ID 

这可以解决你的问题删除

+0

以及如何进行批量删除? – Diego

+0

在这种情况下,删除顶部将工作。我希望你不要清除(全部删除)表格。在这种情况下,截断会更好。所以使用删除TOP(#numberOfRowToDelete)从订单内部加入SomeotherTable对Order.orderCity = SomeOtherTable.ID ............................. ................ –

0

您应该能够根据连接删除。尝试

DELETE FROM tableA 
FROM tableA A 
JOIN tableB B ON A.ID = B.ID 

而且,如果tableB的了〜一百万行,这将真正帮助,如果您对ID列的索引。