2015-02-09 69 views
0

我正在使用SQL Server。面對在SQL Query中處理大量數據的問題。我想從ITEM表中選擇那些不在我給定列表中的記錄。SQL:除了給定的記錄,有效和快速地選擇數百萬條記錄

讓我詳細說明。 我有ITEM表具有ITEM_CODE列。它包含數百萬條記錄。 並從其他來源填充​​一些項目代碼,例如文件。
所以我想從ITEM表中選擇那些不在該填充列表中的記錄。

一樣,

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

使用繁瑣的任務,需要大量的時間。然後我用其他的方式,這樣,

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

您應該避免使用像印地安語紫膠,並不是每個人都瞭解它們。 – 2015-02-09 16:34:46

+0

地球上什麼是LAC? – DavidG 2015-02-09 16:34:50

+0

它的0.1Million @DavidG是否曾嘗試爲您的查詢運行解釋計劃? – SMA 2015-02-09 16:36:00

回答

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) 
+0

Spock,謝謝。這也許是我認爲的很好的解決方案。但問題是,我從CSV文件中獲取Java端的'I1','I2'值,我必須將它傳遞給MyBatis Mappers。因此,創建TEMP表並不是什麼大問題,但是將百萬個項目插入其中,不會像木材化過程那樣? – Jaydeep 2015-02-10 04:26:26

+0

在這種情況下,請查看批量插入,openquery或bcp方法。這將是你最好的選擇,從文件中讀取大量數據到表格中 – Spock 2015-02-10 04:30:28

+0

啊,謝謝。由於某些數據庫依賴性,大容量插入總是很難完成。關於openquery和bcp,對我來說完全是不知情的概念。 – Jaydeep 2015-02-10 05:11:32