如何从INSERT语句

时间:2016-03-24 20:26:09

标签: sql sql-server

我想看看是否有可能改进使用WHERE NOT EXISTS的以下查询?

我想将另一个表中的记录添加到500个批次中的新表中,其中键位于临时表中,但是如果可能的话,它可以提高性能。

WHILE 1 = 1 

BEGIN

INSERT INTO newTable WITH (TABLOCK)
        SELECT TOP(500) *
        FROM srcTable src
        WHERE NOT EXISTS (SELECT 1 FROM newTable WHERE pKey = src.pKey 
                          AND src.pKey IN (SELECT pKey FROM #TempTable))

IF @@ROWCOUNT < 500 BREAK
END

谢谢!

1 个答案:

答案 0 :(得分:0)

将这两个条件放在not exists中似乎很奇怪。所以我在想:

INSERT INTO newTable WITH (TABLOCK)
    SELECT TOP(500) *
    FROM srcTable src
    WHERE NOT EXISTS (SELECT 1 FROM newTable nt WHERE nt.pKey = src.pKey) AND
          NOT EXISTS (SELECT 1 FROM #TempTable tt WHERE src.pKey = t.pkey);

然后,对于此查询,我希望newTable(pkey)#TempTable(pkey)上的索引。

注意:我认为我的逻辑是正确的。将IN放入相关NOT EXISTS中的不相关表格会让人感到困惑。

编辑:

嗯。 。 。如果我的逻辑错误,那么你只需要EXISTS第二个条件:

INSERT INTO newTable WITH (TABLOCK)
    SELECT TOP(500) *
    FROM srcTable src
    WHERE NOT EXISTS (SELECT 1 FROM newTable nt WHERE nt.pKey = src.pKey) AND
          EXISTS (SELECT 1 FROM #TempTable tt WHERE src.pKey = t.pkey);