SQL:除了给定记录之外,选择数百万条记录的高效快捷方式

时间:2015-02-09 16:32:19

标签: sql-server

我正在使用SQL Server。面临SQL Query中处理大量数据的问题。我想从ITEM表中选择那些不在我给定列表中的记录。

让我详细说明一下。 我有ITEM表以ITEM_CODE为列。 它包含数百万条记录。 并从其他来源填充​​一些项目代码,例如文件。
所以我想从ITEM表中选择那些不在该填充列表中的记录。

像,

SELECT ITEM_CODE FROM ITEM WHERE ITEM_CODE NOT IN ('I1', 'I2', 'I3',.......);

使用IN是一项繁琐的任务,需要花费大量时间。然后我用其他方式,像这样,

SELECT ITEM_CODE FROM ITEM WHERE NOT (ITEM_CODE = 'I1' OR ITEM_CODE = 'I2' AND .....)
  • 注意:....意味着数百万参数。

这种方式也需要很多时间。我使用的另一种方式,

    SELECT T.ITEM_CODE FROM ITEM T LEFT JOIN
    (SELECT ITEM_CODE FROM ITEM T1 
    WHERE T1.ITEM_CODE ='I1' OR T1.ITEM_CODE ='I2') AS T2
    on T.ITEM_CODE = T2.ITEM_CODE WHERE T2.ITEM_CODE IS NULL

这样可以提高性能,但仍然不能令人满意。

有没有办法快速完成? 请建议我解决这个问题。
任何答案都会很明显。

谢谢。

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样......

CREATE TABLE #TMP(ITEM_CODE VARCHAR(10))
INSERT INTO #TMP
VALUES('I1'), ('I2'), etc ....

SELECT T.ITEM_CODE 
FROM ITEM T 
    LEFT JOIN #TMP T2 ON T.ITEM_CODE = T2.ITEM_CODE
WHERE T2.ITEM_CODE IS NULL

OR

SELECT T.ITEM_CODE 
FROM ITEM T
WHERE NOT EXISTS(
    SELECT NULL
    FROM #TMP T2
    WHENRE T2.ITEM_CODE = T.ITEM_CODE)

您甚至可以在临时表上创建索引

CREATE INDEX _temp ON #TMP (ITEM_CODE)