如何获取另一个表中不存在的表的记录?
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 会给你更快的执行速度。在您的情况下使用左连接
【讨论】:
以上是关于如何获取另一个表中不存在的表的记录?的主要内容,如果未能解决你的问题,请参考以下文章