2013-06-28 41 views
0

我试图在记录列表上运行更新,并根据一些计算修改列。这是我的查询(我的查询实际执行金额的重分配到NET和增值税):更新从整个表上运行

update transaction_details 
set amount = (
    CASE WHEN id = x.netID THEN x.calculated_NET 
     WHEN id = x.vatID THEN x.calculated_VAT 
    END 
    ) 
from 
    (select 
     d1.id as 'netHmy', 
     d2.id as 'vatHmy', 
     round(((d1.amount + d2.amount)/1.18) * 0.18, 2) 'calculated_VAT', 
     round((d1.amount + d2.amount)/1.18, 2) 'calculated_NET' 
    from transaction_details d1 join transaction_details d2 on d1.id = d2.netID 
    where 
     1 = 1 
     -- multiple conditions 
          ) as x 

选入X平台是175的记录,但是当我运行此查询它会在整个transaction_details表(在4.000.000记录)。

我知道,操作中查询的顺序是

1. FROM clause 
2. WHERE clause 
3. GROUP BY clause 
4. HAVING clause 
5. SELECT clause 
6. ORDER BY clause 

所以我期待更新的结果被约束到选定的175条记录,但显然它会在整个表和结果4.354.665 rows affected

在UPDATE语句中操作的顺序是不同的,还是我应该重新设计我的查询?

回答

3

如果您想要使用任何应用的过滤器,您需要直接引用FROM子句中要更新的表。喜欢的东西:

update d1 --Or d2? 
set amount = (
    CASE WHEN id = d1.netID /*?*/ THEN round((d1.amount + d2.amount)/1.18, 2) 
     WHEN id = d1.vatID /*?*/ THEN round(((d1.amount + d2.amount)/1.18) * 0.18, 2) 
    END 
    ) 
from 
    transaction_details d1 join transaction_details d2 on d1.id = d2.netID 
where 
    1 = 1 
    -- multiple conditions 

我不知道在哪里netIDvatID实际上意味着来自因为你在嵌套SELECT没有表现出他们,我做了一个猜测,该表进行更新是d1,而不是d2。你可能可以从上面适应你的实际需求。

+0

对不起,我不得不编辑我的查询,不得不更换列名,但我错过了一些嵌套选择。现在是正确的,谢谢你指出。 –