1

2 つのテーブルがMainありOther、次のようになっているとします。

                    Main
+----------+-----------------------------------+
|  Field1  |  <set of other columns...>        |
+----------+-----------------------------------+
|   NULL   |           ...                     |
|   NULL   |           ...                     |
|   NULL   |           ...                     |


                          Other
           +-----------------------------------+
           |  <same set of other columns...>   |
           +-----------------------------------+
           |           ...                     |
           |           ...                     |
           |           ...                     |

Main.Field1残りの列をまとめて、行にない場所を更新する簡潔な方法はありOtherますか?

Field1つまり、各行を更新したい

SELECT <set of other columns...> FROM Main
   EXCEPT
SELECT <same set of other columns...> FROM Other

動的 SQL はオプションですが、このようなことを行う最も効率的な方法を見つけようとしています。

4

2 に答える 2

1

本当に必要な場合は、Except句を使用できます

UPDATE m
SET field = 'AValue'
FROM 
   MAIN  m
   INNER JOIN 
    (SELECT * FROM MAIN
    EXCEPT
    SELECT * FROM OTHER ) t
on m.PK = t.PK

デモ

*ここでの使用は非常に脆弱であり、フィールドリストを明示的に設定する必要があることに注意して ください。また、結合フィールド(PK)がメインとその他の両方で使用可能であり、それらが同じであると想定しています。

それ以外の場合は、NOT EXISTSまたはANTI-JOIN(LEFT / ISNULL)を使用する方がはるかに優れています。

UPDATE m
   SET Field1 = 'foo'
FROM 
   Main m
   LEFT JOIN 
     Other o
    ON m.FIELD2 = o.FIELD2
    AND m.FIELD3 = o.FIELD3
WHERE 
   o.PK is null

デモ

于 2012-06-15T15:44:41.760 に答える
1
update m
set ...
from Main m
where not exists(select * from Other where <columns-equal>)

これは、左アンチセミ結合に変換されます。

左結合を使用することもできますが、これは通常の左結合プラス フィルターに変換され、効率がわずかに低下します。これはオプティマイザの弱点のようです。

于 2012-06-15T15:41:07.917 に答える