SQL 查询逻辑- SQL Server 2008

3
有没有办法改进这个查询...
INSERT INTO mastertable 
VALUES      (SELECT * 
             FROM   staging_tbl s 
             WHERE  s.pac NOT IN (SELECT pac 
                                  FROM   mastertable) 
                    AND s.store NOT IN (SELECT store 
                                        FROM   mastertable)) 

一开始不确定这是否有效.. 基本上..只想从Staging_Tbl中选择记录,如果相同的PAC-STORE组合当前不存在.. 如果PAC存在但是为另一个STORE,则是的,我们应该选择,反之亦然。
例如: 如果MasterTable如下所示,

PAC1  STORE1
PAC1  STORE2
PAC2  STORE1
PAC2  STORE2

如果暂存表中有像PAC1 STORE3这样的记录,而不是PAC1 STORE2,那么我只应该插入。

2个回答

8

你是否在这些列上创建了索引..这将会产生改变

你也可以使用NOT EXISTS

INSERT INTO MASTERTABLE 
 SELECT * FROM Staging_Tbl S 
 WHERE NOT EXISTS ( SELECT 1 FROM MasterTable M 
            WHERE S.STORE = M.STORE
            AND S.PAC = M.PAC)

或者左连接

 INSERT INTO MASTERTABLE 
 SELECT S.* FROM Staging_Tbl S 
 LEFT OUTER JOIN MasterTable M 
    ON S.STORE = M.STORE
    AND S.PAC = M.PAC
WHERE M.PAC IS NULL
AND M.STORE IS NULL

除此之外,一定要测试这个的性能。

INSERT INTO MASTERTABLE 
 SELECT * FROM Staging_Tbl 
 EXCEPT
 SELECT * FROM MASTERTABLE

我个人最喜欢使用 NOT EXISTS

另请参见从一个表中选择不存在于另一个表中的所有行,其中使用 OUTER APPLY 和 EXCEPT 来实现相同的功能


1
LEFT JOIN 版本需要修复。您想选择 S.* 而不是 * - Andriy M
1
Andriiy说:“只有在当前不存在相同的PAC-STORE组合时才可以执行。” - SQLMenace
我的错,你是正确的。我只是比较了对应原始问题的解决方案。应该先仔细阅读详情。抱歉。 - Andriy M

1
INSERT MASTERTABLE
SELECT * FROM Staging_Tbl S
WHERE NOT EXISTS
(SELECT 1 FROM MASTERTABLE M
 WHERE M.PAC = S.PAC AND M.STORE = S.STORE)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接