希望这对你来说比我更聪明。我试图从另一个匹配的表执行插入表,但我只想插入如果该行尚不存在。如果存在,则行中的某些值可能会更改。哪个没关系。
我在想是否有两个列在插入时匹配,然后不插入并保留记录。如果这两列不匹配,则插入该行。我已经查看了合并,并且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'不存在时插入。这些字段无法更改。有什么想法吗?
答案 0 :(得分: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
时列出列是个好主意。