2017-06-27 3 views
1

うまくいけば、これは私よりもあなたのために簡単なものです。私は別の一致するテーブルからテーブルへの挿入を実行しようとしていますが、行がまだ存在していない場合にのみ挿入します。行内のこれらの値の一部は、変更される可能性があります。それは大丈夫です。2つの識別列のみを使用してINSERT INTOを除外します

挿入の際に2つの列が一致した場合、そのまま挿入してそのまま残しておくと思っています。これら2つの列が一致しない場合は、行を挿入します。私はマージを見て、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 

上記のコードの問題は、すべての列を一致させる必要があります。そうでないと、テーブル定義が一致しないことがわかります。私は識別子としてタイムスタンプとシリアル番号だけを使いたい。私は、他のフィールドが変更される可能性があるので、一致させたくありません。

問題は、すでにレコードがLotDetailテーブルに存在し、 'hotweight'または 'marketvalue'が変更されている場合、その変更を保持してレコードを上書きしないことです。私は単に 'serialno'と 'timestamp'が存在しないときにだけ挿入するようにしています。これらのフィールドは変更できません。何かご意見は?

答えて

2

ええと、あなたはあなたのテーブルを後ろに持っていると思います。 「ステージング」テーブルから最終的なテーブルに挿入するほうが意味があります。

次に、あなたの代わりにEXCEPTNOT EXISTSを使用することができます。

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

ありがとうございます。これはまさに私が必要としていたものです。それは完璧をテストする。 –

関連する問題