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

交叉连接返回两个集合的乘积,当vendors使用条件减少为空集时,v.vendorid = -34结果集为空,因为任何乘以零的值都为零。

于 2012-12-03T23:40:13.170 回答
0

这是因为在第一种情况下,对于 Invoices 中的每个值(存在ID 为 34的供应商),WHERE 子句都被评估为 true,因此当 ID=-34 时,每条记录都会更新,反之亦然——没有记录更新,因为 VendorID= -34 总是错误的。

例如,假设我们设置了 InvoicesI {... does not matter ... }和 Vendors 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 回答