2017-06-27 32 views
1

希望這是一個容易的人你比我更聰明。我想從另一個匹配表執行插入到表中,但我只想插入,如果該行不存在。行中的某些值如果存在可能會更改。沒關係。插入除了只使用2個識別列

我在想,如果插入兩列匹配,那麼不要插入並保留原樣。如果這兩列不匹配,則插入該行。我已經通過合併,並插入到除外。這段代碼將起作用:但這不是我所需要的。

INSERT INTO LotDetail 
SELECT UID, LotKey, SerialNo, TypeID, HotWeight, YieldGradKey, PeltGrade, 
WeightRange, MarketValue, PremiumDiscount, PeltValue, OffalValue, 
PricingKey, USDAGrade, [Timestamp] FROM LotDetail 
EXCEPT 
SELECT UID, LotKey, SerialNo, TypeID, HotWeight, YieldGradKey, PeltGrade, 
WeightRange, MarketValue, PremiumDiscount, PeltValue, OffalValue, 
PricingKey, USDAGrade, [Timestamp] FROM LotDetail_STAGING 

上述代碼的問題是我必須匹配所有列,否則它會告訴我表定義不匹配。我只想將時間戳和serialno作爲標識符。我不想匹配其他領域,因爲他們可能會改變。

問題是,如果記錄已經存在LotDetail表中並且「熱量」或「市場價值」已更改,我想保留這些更改並且不覆蓋記錄。我只是想只在'serialno'和'timestamp'不存在時插入。這些字段不能更改。有什麼想法嗎?

回答

2

嗯,我認爲你有你的表倒退。從「分段」表格插入到決賽桌中對我來說更有意義。

然後,您可以使用NOT EXISTS代替EXCEPT

INSERT INTO LotDetail(UID, LotKey, SerialNo, TypeID, HotWeight, YieldGradKey, PeltGrade, 
         WeightRange, MarketValue, PremiumDiscount, PeltValue, OffalValue, 
         PricingKey, USDAGrade, [Timestamp] 
        ) 
    SELECT UID, LotKey, SerialNo, TypeID, HotWeight, YieldGradKey, PeltGrade, 
      WeightRange, MarketValue, PremiumDiscount, PeltValue, OffalValue, 
      PricingKey, USDAGrade, [Timestamp] 
    FROM LotDetail_STAGING ls 
    WHERE NOT EXISTS (SELECT 1 
         FROM LotDetail l 
         WHERE l.SerialNo = ls.serialNo AND 
          l.[Timestamp] = ls.[Timestamp] 
        ); 

我也認爲這是一個好主意,列出列做一個INSERT時。

+0

非常感謝。這正是我需要的。它測試完美。 –