sql >> データベース >  >> RDS >> Sqlserver

SQL マージまたは UPDATE / INSERT の使用

    UPDATE m SET 
      col2 = t.col2, 
      col3 = t.col3 -- etc. - all columns except Customer_Number
    FROM dbo.Master_File AS m
    INNER JOIN 
    (
      SELECT 
        Customer_Number, rn = ROW_NUMBER() OVER
        (
          PARTITION BY Customer_Number ORDER BY [timestamp_column] DESC
        ), col2, col3, ... etc ...
      FROM dbo.Temp_Table
    ) AS t
    ON m.Customer_Number = t.Customer_Number
    WHERE t.rn = 1;
    
    INSERT dbo.Master_File(Customer_Number, col2, col3, ...etc...)
      SELECT Customer_Number, col2, col3, ...etc...
      FROM 
      (
        SELECT 
          Customer_Number, rn = ROW_NUMBER() OVER 
          (
            PARTITION BY Customer_Number ORDER BY [timestamp_column DESC
          ),
          col2, col3, ...etc...
        FROM dbo.Temp_Table AS t 
        WHERE NOT EXISTS 
        (
          SELECT 1 FROM dbo.Master_File AS m
          WHERE m.Customer_Number = t.Customer_Number
        )
      ) AS x WHERE rn = 1;
    

    これにより、宛先にまだ存在しないソース テーブルの複数の行が処理されます。調整が必要な列名について推測しました。

    MERGE 魅力的かもしれませんが、敬遠する理由がいくつかあります:

    <オール>
  1. 構文が難しくて覚えにくい...
  2. あなたは特定のロックのヒントを意図的に追加しない限り、上記のアプローチよりも多くの同時実行性を得ることはできません ...
  3. マージ そしておそらく、まだ明らかにされていない多くのこと...
  4. 最近、警告のヒントを公開しましたここにも 他の意見をここに集めました .




    1. セッションの変更により、Hibernateを介したクエリの速度が低下します

    2. Codeigniterを使用した複数の画像のアップロードにより、MySQLデータベースへのファイルパスが1つだけ保存されます

    3. SQL Developerで生の変数長が長すぎるエラーを回避するにはどうすればよいですか?

    4. このエラーを解決するにはどうすればよいですか?非推奨:mysql_escape_string():この関数は非推奨です。代わりにmysql_real_escape_string()を使用してください