2016-10-28 76 views
0

我怎样才能改变这种代码的多行的更新工作。@ id为int和ORDER_ID是主键,但我要检查每一个已status_b =行'套袋多行更新

select @id=inserted.order_id from inserted; 
if update(status_b) 
    begin 
    if (select status_b from inserted)='bagged' 
    begin 
     if (select o.id 
       from [order] o 
       left join [print] p on o.id=p.order_id 
       left join [laminate] l on l.order_id=o.id 
       left join [slitting] s on s.order_id=o.id 
       left join [bagging] b on b.order_id=o.id 
       where       
          1=(case when (o.printing='دارد' and status_p='printed') or o.printing='ندارد' then 1 end) 
         and 1=(case when (o.lamination='دارد' and status_l1='laminated') or o.lamination='ندارد' then 1 end) 
         and 1=(case when (o.lamination='دارد' and l.layer2<>'' and status_l2='laminated2') or o.lamination='ندارد' then 1 end) 
         and 1=(case when (o.coldseal='دارد' and status_c='coldsealed') or o.coldseal='ندارد' then 1 end) 
         and 1=(case when (o.slitting='دارد' and status_s='slitted') or o.slitting='ندارد' then 1 end) 
         and 1=(case when (o.bagging='دارد' and status_b='bagged') or o.bagging='ندارد' then 1 end) 
         and [email protected]) is not null 
     begin 
     update [order] set [status]='finished' where [email protected] 
     end 
    end 
    end 

回答

2

看到的不理解首先你触发的目的(总线。规则)。

如果具有大查询的conndtion不是require.you可以在直接更新staement中绑定相同的连接和condtion,这样多个orderid可以被优先考虑并且性能会很好>此查询可能有错误,您需要修复但尝试这样的事情。

UPDATE A SET [STATUS]='FINISHED' FROM [ORDER] A 
INNER JOIN INSERTED C 
ON A.ID=B.OID 
LEFT JOIN [PRINT] P ON O.ID=P.ORDER_ID 
LEFT JOIN [LAMINATE] L ON L.ORDER_ID=O.ID 
LEFT JOIN [SLITTING] S ON S.ORDER_ID=O.ID 
LEFT JOIN [BAGGING] B ON B.ORDER_ID=O.ID 
WHERE       
1=(CASE WHEN (O.PRINTING='دارد' AND STATUS_P='PRINTED') OR O.PRINTING='ندارد' THEN 1 END) 
AND 1=(CASE WHEN (O.LAMINATION='دارد' AND STATUS_L1='LAMINATED') OR O.LAMINATION='ندارد' THEN 1 END) 
AND 1=(CASE WHEN (O.LAMINATION='دارد' AND L.LAYER2<>'' AND STATUS_L2='LAMINATED2') OR O.LAMINATION='ندارد' THEN 1 END) 
AND 1=(CASE WHEN (O.COLDSEAL='دارد' AND STATUS_C='COLDSEALED') OR O.COLDSEAL='ندارد' THEN 1 END) 
AND 1=(CASE WHEN (O.SLITTING='دارد' AND STATUS_S='SLITTED') OR O.SLITTING='ندارد' THEN 1 END) 
AND 1=(CASE WHEN (O.BAGGING='دارد' AND STATUS_B='BAGGED') OR O.BAGGING='ندارد' THEN 1 END) 
+1

你应该在WHERE子句 – MtwStark

+0

上添加C.STATUS_B ='BAGGED' c.oid不是'b.oid',装入左边的连接为b 3行后面和'c.status_b ='bagged'在where子句@KumarHarsh –

0

试试下面采取一切订单ID从inserted并插入到临时表,做你的作业

SELECT INSERTED.ORDER_ID AS OID INTO #TEMP1 FROM INSERTED WHERE STATUS_B='bagged'; 
IF UPDATE(STATUS_B) 
    BEGIN 

     IF (SELECT O.ID 
       FROM [ORDER] O 
       join #temp1 t 
       on t.OID=o.id 
       LEFT JOIN [PRINT] P ON O.ID=P.ORDER_ID 
       LEFT JOIN [LAMINATE] L ON L.ORDER_ID=O.ID 
       LEFT JOIN [SLITTING] S ON S.ORDER_ID=O.ID 
       LEFT JOIN [BAGGING] B ON B.ORDER_ID=O.ID 

       WHERE       
          1=(CASE WHEN (O.PRINTING='دارد' AND STATUS_P='PRINTED') OR O.PRINTING='ندارد' THEN 1 END) 
         AND 1=(CASE WHEN (O.LAMINATION='دارد' AND STATUS_L1='LAMINATED') OR O.LAMINATION='ندارد' THEN 1 END) 
         AND 1=(CASE WHEN (O.LAMINATION='دارد' AND L.LAYER2<>'' AND STATUS_L2='LAMINATED2') OR O.LAMINATION='ندارد' THEN 1 END) 
         AND 1=(CASE WHEN (O.COLDSEAL='دارد' AND STATUS_C='COLDSEALED') OR O.COLDSEAL='ندارد' THEN 1 END) 
         AND 1=(CASE WHEN (O.SLITTING='دارد' AND STATUS_S='SLITTED') OR O.SLITTING='ندارد' THEN 1 END) 
         AND 1=(CASE WHEN (O.BAGGING='دارد' AND STATUS_B='BAGGED') OR O.BAGGING='ندارد' THEN 1 END) 
         ) IS NOT NULL 
     BEGIN 
     UPDATE A SET [STATUS]='FINISHED' FROM [ORDER] A JOIN #TEMP1 C ON A.ID=B.OID 
     END 
    END 
+0

这是不行的,'(SELECT STATUS_B为由插入)='BAGGED''将返回多行,它会触发一个例外 – MtwStark

+0

@MtwStark用户已请求一次,所以我处理所有行没有检查用户的整个代码。是的,正如你所说,它会抛出异常。用户需要使用If Exists子句处理。我会做出改变 – Buddi

+0

@MtwStark加入我的帖子。 – Buddi