仅使用2个标识列

时间:2017-06-27 18:26:44

标签: sql sql-server merge sql-server-2012 insert

希望这对你来说比我更聪明。我试图从另一个匹配的表执行插入表,但我只想插入如果该行尚不存在。如果存在,则行中的某些值可能会更改。哪个没关系。

我在想是否有两个列在插入时匹配,然后不插入并保留记录。如果这两列不匹配,则插入该行。我已经查看了合并,并且INSERT INTO EXCEPT。这段代码可行:但它不是我需要的。

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

上面代码的问题是我必须匹配所有列,否则它告诉我表定义不匹配。我只想将timestamp和serialno作为标识符。我不想在其他领域匹配,因为它们可能会改变。

问题是如果记录已经存在于LotDetail表上并且'hotweight'或'marketvalue'已经改变,我想保留这些更改而不是覆盖记录。我只是想在'serialno'和'timestamp'不存在时插入。这些字段无法更改。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

嗯,我觉得你的桌子倒退了。从" staging"中插入对我来说更有意义。表进入决赛桌。

然后,您可以使用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时列出列是个好主意。