我有2个表,orderData和stagingOrderData。我需要查看stagingOrderData中是否存在orderData中存在的任何行,以便我可以在导入之前从stagingOrderData表中删除它们。
测试用例 - 我尝试了一个连接
select * from
dbo.stagingOrderData s
inner join dbo.OrderData o
on s.productid = o.productid
and s.barcode = o.barcode
and s.orderid = o.orderid
然后和“存在”
select * from
dbo.stagingOrderData s
where exists(dbo.OrderData o
select * from
where o.productid = s.productid
and o.barcode = s.barcode
and o.orderid = s.orderid )
“存在”的陈述似乎要快得多。
答案 0 :(得分:1)
存在通常会更快。在找到第一场比赛之后,它会在连接必须考虑所有可能的匹配之后停止。
你可能想问一下你是否需要这样做。您可能最好不要使用“where not exists ...”限制执行插入操作,而不是删除行。如果您使用的是SQL Server 2008,那么使用合并语句可以做得更好。
答案 1 :(得分:1)
我的经验是,这是一个折腾。如果你对两个表有很好的索引(你需要一个带有productid,条形码和orderid的索引),我敢打赌这两个查询的表现大致相同。所以我会使用你认为更容易阅读/维护的那些。
另外,如果您所做的只是查询以确定是否需要删除,那么最好不要跳过选择并只删除。如果没有要删除的内容,delete语句将发现该内容并且不执行任何操作。换句话说,如果您发现需要删除任何内容,执行选择需要您处理数据两次。相反,只执行删除操作,无论如何都只处理数据。