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

Posted

技术标签:

【中文标题】如何获取另一个表中不存在的表的记录?【英文标题】:How do I get a records for a table that do not exist in another table? 【发布时间】:2014-12-22 12:23:55 【问题描述】:

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

让我们将此表称为 Staging_Table

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

现在为了简化事情,暂存表包含大约 97000 条记录,而产品表只有 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 )

【问题讨论】:

暂存表有索引吗? 【参考方案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】:

使用 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 

【讨论】:

【参考方案3】:

对于这些繁重的数据,你必须使用 LEFT JOIN,而另一件事 'IN/NOT IN' 会让你的查询执行起来很繁重,运行时间也会更长。使用 join 会给你更快的执行速度。在您的情况下使用左连接

【讨论】:

以上是关于如何获取另一个表中不存在的表的记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何从一个表中获取另一表中不存在的行

VF中如何将一个表的内容复制到另一个已经存在的表中

mysql获取条件中描述的所有记录,即使表中不存在

如果记录已经存在于jsp页面的表中,如何获取错误消息

如何从一个表中获取包含另一表的详细信息的记录计数

如何获取一个MySql表中存在的记录而不是另一个[重复]