这是我的第一篇文章!忍受着我。 我有一个更新声明,我想了解SQL Server如何处理它。更新表设置字段
UPDATE a
SET a.vField3 = b.vField3
FROM tableName a
INNER JOIN tableName b on a.vField1 = b.vField1
AND b.nField2 = a.nField2 – 1
这是我的查询以其最简单的形式。
vField1 is a Varchar
nField2 is an int (autonumber)
vField3 is a Varchar
我已经离开了WHERE子句,所以明白了逻辑,否则会使得这个nessessity。
说vField1是客户编号,客户有3个记录 nField2中的值是1,2和3连续。 vField3是一个状态
当更新来a.nField2 = 1没有a.nField2 -1所以它继续 当更新来a.nField2 = 2,b.nField2 = 1 当更新到a.nField2 = 3,b.nField2 = 2
因此,当更新是在a.nField2 = 2上,别名b反映了先前行上的内容(b.nField2 = 1) 而且它SET a.vField3的Varchar值= b.vField3
当更新位于a.nField2 = 3时,别名b反映了先前行上的内容(b.nField2 = 2) 而且它(应该)设置a.vField3 = b.vField3的Varchar值
当过程完成时 - 三条记录中的第二条记录与预期相符 - 第二条记录的vField3中的值反映第一条记录中vField3的值
但是,第三条记录的vField3并不反映第二条记录中vField3的值。
我认为这表明SQL Server可能正在生成某种事务然后进行更新。
问题:如何在每次事务后获得数据库更新,以便我可以引用每个事务生成的值?
谢谢。 davlyo
“但是,第三条记录的vField3不反映第二条记录中vField3的值。”你得到了什么?你是指第二个记录的新值或原始值? – mdma 2010-06-09 21:58:34
你从完全错误的角度出发,根据游标而不是逻辑集合操作来思考 - 阅读一本书并挖掘其中的差异,但不用担心,对于第一个处理SQL的程序员来说,这是一个非常常见的缺陷时间。 – Cruachan 2010-06-09 22:23:15
我认为“tablename a”和“tablename b”实际上是2个不同的表,而不是一个具有两个不同别名的表? (这会使它成为一个自连接,而且毫无意义) – BradC 2010-06-09 22:28:23