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

以下の 2 つの更新ステートメントは SQL でどのように異なりますか?

    内部結合では、違いは意味的な違いだけです。両方のクエリは、まったく同じクエリ プランとまったく同じ結果を生成する必要があります。

    ただし、外部結合を使用している場合は、条件が where にあるかどうかが重要です 句または on on 節。

    UPDATE li
    SET li.Description = im.Description
    FROM tbSupplierLineItem li
    RIGHT JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode 
                                    AND li.ProcessedDate >= CONVERT(DATE,GETDATE())
      

    とは異なります
    UPDATE li
    SET li.Description = im.Description
    FROM tbSupplierLineItem li
    RIGHT JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode 
    WHERE li.ProcessedDate >= CONVERT(DATE,GETDATE())
      

    セマンティック レベルだけではありません。
    最初のクエリは正しい結合の期待される結果を返しますが、2 番目のクエリは実際には内部結合から期待される結果を返します。
    これは、正しいテーブルの値が左のテーブルに一致しないレコードがある場合は null になる可能性があり、任意の値を null (別の null を含む) と比較すると false になるため、基本的に右の結合を内部結合に変更しています。



    1. T-SQLのバグ、落とし穴、およびベストプラクティス–ウィンドウ関数

    2. mysql/sqlserverでの切り捨てと削除の比較

    3. PostgresSQLSELECTとUPDATEの動作が異なります

    4. SQL Serverで親テーブル、参照テーブル、外部キー制約の名前と列を取得する方法-SQL Server/TSQLチュートリアルパート71