2011-04-05 100 views
3

有改善查詢的方式..SQL查詢邏輯 - SQL Server 2008中

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

不知道這是否會在第一個地方工作.. Basically..want來選擇記錄從Staging_Tbl只有相同PAC-STORE組合目前不存在。如果PAC存在,但是對於另一個STORE..yes,我們應該選擇,反之亦然。
對於例如:如果如果MasterTable是如下,

PAC1 STORE1 
PAC1 STORE2 
PAC2 STORE1 
PAC2 STORE2 

如果在臨時表像PAC1 STORE3記錄我應該只插入.. 和NOT PAC1商店2

回答

8

你有指標這些columns..that會做出改變

你也可以使用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) 

或LEFT JOIN

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最好

Select all rows from one table that don't exist in another table見OUTER的使用APPLY和除了同樣做

+1

LEFT JOIN版本需要一些修復。你想選擇'S. *'而不是'*'。 – 2011-04-05 17:38:38

+0

+1 - 無論如何只要使用'EXISTS',它就會運行得更快。 – JNK 2011-04-05 17:39:13

+0

修正了左連接問題,謝謝 – SQLMenace 2011-04-05 17:40:40

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)