1

次のクエリを実行すると

UPDATE Invoices
SET PaymentTotal = 1
FROM Vendors
WHERE Vendors.VendorID = 34 -- true for some row

SQL Server は請求書のすべてのレコードを更新します。ただし、条件が Vendors テーブルのどの行にも一致しない場合:

UPDATE Invoices
SET PaymentTotal = 1
FROM Vendors
WHERE Vendors.VendorID = -34 -- false for all rows

行は更新されません。なぜ?

編集:これは完全に学術的な質問であり、これがクエリを記述する理想的な方法ではないことを理解しています。

4

2 に答える 2

1

元のクエリ:

UPDATE Invoices
SET PaymentTotal = 1
FROM Vendors
WHERE Vendors.VendorID = 34

次と同等です。

update i set paymenttotal = 1
from vendors v
cross join invoices i
where v.vendorid = 34

交差結合は 2 つのセットの積を返し、vendors基準を使用して空のセットに縮小するとv.vendorid = -34、結果のセットは空になります。

于 2012-12-03T23:40:13.170 に答える
0

これは、最初のケースで請求書のすべての値に対してWHERE句がtrueと評価されるため( IDが34のベンダーが存在する、ID = -34の場合はすべてのレコードが更新され、その逆も同様です。VendorID=のため、レコードは更新されません。 -34は常にfalseです。

たとえば、請求書I {... does not matter ... }とベンダーを設定したとしV.VendorIDs {1 .. 35}ます。

set PaymentTotal = 1 when VendorID=34 exists  
-- 34 exists so this is executed

set PaymentTotal = 1 when VendorID=-34 exists
-- -34 does not exists so this is never executed

これらは無関係なセット間のセット操作であるため、結果は期待されません(このタイプの分析を行わない限り)。

それらを関連付けると(以下のクエリのように)、このロジックが変更され、「期待される」結果が得られます。


私はあなたがこれらの線に沿って何かを望んでいると信じています:

UPDATE Invoices
SET PaymentTotal = 1
FROM Vendors
WHERE Vendors.VendorID = 34 and Invoices.VendorID = Vendors.VendorID

...そして私はあなたが実際にVendorIDを知らないが、このクエリが意味をなすような別のVendorフィールドを知っていると仮定しています(IDをすでに知っている場合は別のテーブルをクエリする意味がないため)。

于 2012-12-03T23:42:22.707 に答える