代码之家  ›  专栏  ›  技术社区  ›  Saif Khan

哪个SQL语句更有效地连接或存在

  •  0
  • Saif Khan  · 技术社区  · 15 年前

    我有两个表,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 )
    

    带有“exists”的语句似乎要快得多。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jeff Siver    15 年前

    我的经验是,这是一个折腾。如果您对这两个表有良好的索引(您需要一个包含productID、barcode和orderID的索引),我敢打赌这两个查询将执行相同的操作。所以我会用你认为更容易阅读/维护的。

    另外,如果您所做的只是查询以确定是否需要删除,那么最好跳过选择并只进行删除。如果没有要删除的内容,则DELETE语句将发现这一点,并且不会执行任何操作。换句话说,如果发现需要删除的内容,执行选择操作需要处理数据两次。相反,只执行删除操作,不管怎样,只处理一次数据。

        2
  •  1
  •   TimothyAWiseman    15 年前

    一个存在通常会更快。它在找到第一个匹配之后停止,在这里联接必须考虑所有可能的匹配。

    你可能想问一下你是否需要这样做。与其删除行,不如使用“Where not exists…”限制进行插入。如果您使用的是SQL Server 2008,那么使用MERGE语句可以做得更好。