我正在使用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
这样可以提高性能,但仍然不能令人满意。
有没有办法快速完成?
请建议我解决这个问题。
任何答案都会很明显。
谢谢。
答案 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)