如何获取另一个表中不存在的表的记录?

时间:2014-12-22 12:23:56

标签: sql select subquery sql-delete notin

我有一个临时表,它作为计划批处理脚本的一部分进行更新。

让我们调用此表Staging_Table

现在我每天都会使用Staging_Table中的条目更新名为Product_Table的表格。 我需要删除Products_Table中没有Staging表条目的行。

现在为了解决问题,临时表保存了大约97000条记录,而producst表只有7000条。但是每天,临时表中的条目增加了97000.我有一个名为TDC_IDP_ID的产品密钥....

所以我有这个查询似乎永远需要执行......

DELETE FROM Product_Table
        WHERE PRODUCT_TD_PARTCODE NOT IN ( SELECT TDC_TD_PARTCODE FROM Staging_Table WHERE TDC_IDP_ID = @TDC_IDP_ID )

现在内部查询有97000条记录。我如何优化此查询(至少运行)还是有另一种方法可以解决这个问题?而不是选择我尝试了以下查询,它仍在运行,因为我键入此问题。它已经运行了11分钟......

SELECT COUNT(*)
        FROM   Product_Table
        WHERE PRODUCT_TD_PARTCODE NOT IN ( SELECT TDC_TD_PARTCODE FROM Staging_Table WHERE TDC_IDP_ID = @TDC_IDP_ID )

3 个答案:

答案 0 :(得分:1)

使用 LEFT JOIN 代替 NOT IN

试试这个:

SELECT COUNT(*)
FROM Product_Table PT 
LEFT OUTER JOIN Staging_Table ST ON PT.PRODUCT_TD_PARTCODE = ST.TDC_TD_PARTCODE AND ST.TDC_IDP_ID = @TDC_IDP_ID 
WHERE ST.TDC_TD_PARTCODE IS NULL 

DELETE PT 
FROM Product_Table PT 
LEFT OUTER JOIN Staging_Table ST ON PT.PRODUCT_TD_PARTCODE = ST.TDC_TD_PARTCODE AND ST.TDC_IDP_ID = @TDC_IDP_ID 
WHERE ST.TDC_TD_PARTCODE IS NULL 

答案 1 :(得分:1)

首先,将索引改为not exists

DELETE FROM Product_Table
    WHERE NOT EXISTS (SELECT 1
                      FROM Staging_Table st
                      WHERE st.TDC_IDP_ID = @TDC_IDP_ID  AND
                            st.TDC_TD_PARTCODE = product_table.PRODUCT_TD_PARTCODE
                     );

然后你想要一个登台表的索引:

create index idx_Staging_Table_2 on Staging_Table(TDC_TD_PARTCODE, TDC_IDP_ID);

答案 2 :(得分:0)

对于这些繁重的数据,你必须使用LEFT JOIN,而另一件事'IN / NOT IN'将使你查询如此繁重而且运行时间会更多。使用join将使您更快地执行。在您的情况下使用左连接