【问题标题】:INSERT INTO EXCEPT using only 2 identify columnsINSERT INTO EXCEPT 仅使用 2 个标识列
【发布时间】:2017-11-30 22:13:35
【问题描述】:

希望这对比我聪明的你们来说是一件容易的事。我正在尝试从另一个匹配表执行插入到表中,但我只想在该行不存在时插入。行中的某些值(如果存在)可能会更改。没关系。

我在想如果有两列在插入时匹配,那么不要插入并保持原样。如果这两列不匹配,则插入该行。我已经查看了合并,并且还插入了 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

上面代码的问题是我必须匹配所有列,否则它会告诉我表定义不匹配。我只想将时间戳和序列号作为标识符。我不想匹配其他字段,因为它们可能会改变。

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

【问题讨论】:

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


    【解决方案1】:

    嗯,我想你的桌子倒了。从“暂存”表插入到最终表中对我来说更有意义。

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

    【讨论】:

    • 非常感谢。这正是我所需要的。它测试完美。
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多