精华内容
下载资源
问答
  • update biaozhunhuamuban a inner join dept b on a.dept_id=b.id set a.path= replace(a.path,"tt平台\tt资料",b.dept_name) where a.dept_id =7 2 update biaozhunhuamuban a ,dept b set a.path= replace(a....

     1

    update  biaozhunhuamuban a
    inner join dept b on a.dept_id=b.id
    set a.path= replace(a.path,"tt平台\tt资料",b.dept_name)
    where a.dept_id =7

    2

    update  biaozhunhuamuban a ,dept b
    set a.path= replace(a.path,"tt平台\tt资料",b.dept_name)
    where  a.dept_id=b.id and a.dept_id =7

     

    展开全文
  • 使用 mysql 就不太强,而且写的复杂SQL多是 select 查询语句,最怕复杂update 语句了。 所以在这里总结一下 关联需要更新的表或者根据 需要更新表,来执行更新 有一张订单明细表,我需要 更新 明细表里面...

    使用 mysql 就不太强,而且写的复杂SQL多是 select 查询语句,最怕复杂的 update 语句了。

    所以在这里总结一下

    1.  关联需要更新的表或者根据 需要更新表,来执行更新

     有一张订单明细表,我需要 更新 明细表里面的 金额和重量, 这个 更新的依据是 根据 订单明细表里面的  某些数据的 来进行 算出来 重量或者金额 来进行更新的。

    当然 这个订单明细表 需要根据 订单主表 来进行查询出来。

     

    首先 第一步 我写出来的SQL ,看起来也不算复杂

    UPDATE gwqmshop_process_order_item set total_weight=1*count * (
    	 SELECT units.unitWeight from (
    	SELECT isrc.total_weight/isrc.count as unitWeight from	gwqmshop_process_order_item as isrc 
       where src_order_item_id=isrc.id 	
    	) as units
    	),
     total_amount=total_weight*price
     where id in (
    	SELECT item.id from 
      (
    	SELECT it.id  from  gwqmshop_process_order_item as it
     where 
    it.disabled=0 
    	and it.order_id in (
    	SELECT o.id from gwqmshop_process_order o  where o.disabled=0 and o.data_type=3 and o.createtime>'2018-05-26 22:00:00'
    	) 
      ) item
    );

     

    更新的时候 where 语句必须 这样的写法, 

    否则 mysql 就会报错,因为 mysql 是不能 通过 查询 自身然后来进行 更新的。

    报错内容:

    MYSQL之You can't specify target table for update in FROM clause

     

    参考地址: https://blog.csdn.net/z_youarethebest/article/details/53785487

     

    上面的刚才我写的SQL语句, 是没有报错, 可是 执行更新之后, 更新的结果都 是 被更新为 null 了。

    我这里是 mysql 5.6 不知道是不是 mysql的bug , 即没有报错,又被更新为 null 了。。。

    原因是 因为  where src_order_item_id=isrc.id      这个语句, 在 mysql 中 是 获取 不到  

    订单明细表 里面的 src_order_item_id  这个字段内容的。

    如果我们改为 :

    where isrc.id=gwqmshop_process_order_item.src_order_item_id

    mysql 就会报错了, 报错是因为 找不到  gwqmshop_process_order_item 表。

    其实不管是 update 语句,还是 select 语句,  字段 通过  查询其他表,但是又需要更加当前查询的表的内容取管理的话,都是会报错的。

    因为 最外层的表的内容传不去里面的 临时表的。

    例子 :

    
     SELECT  i.id ,i.src_order_item_id,i.total_amount,i.total_weight,i.count * ( 
    	SELECT isrc.total_weight/isrc.count
    	from gwqmshop_process_order_item isrc where isrc.id =i.src_order_item_id
    ) 
     from gwqmshop_process_order_item i 
    where i.disabled=0 
    	and i.order_id in (
    	SELECT o.id from gwqmshop_process_order o  where o.disabled=0 and o.data_type=3 and o.createtime>'2018-05-26 22:00:00'
    	) ;
    
    
    上面的语句肯定是没有问题的,如果改动一下就有问题了
    
     SELECT  i.id ,i.src_order_item_id,i.total_amount,i.total_weight,i.count * (
      SELECT units.unitWeight from  
    	(SELECT isrc.total_weight/isrc.count  as unitWeight
    	from gwqmshop_process_order_item isrc where isrc.id =i.src_order_item_id
    	)  as units
    ) 
     from gwqmshop_process_order_item i 
    where i.disabled=0 
    	and i.order_id in (
    	SELECT o.id from gwqmshop_process_order o  where o.disabled=0 and o.data_type=3 and o.createtime>'2018-05-26 22:00:00'
    	) ;
    
    
    然后就会报错 :
    Unknown column 'i.src_order_item_id' in 'where clause'
    
    
    
    那为什么更新的时候不能使用第一种的方式呢?
    
    	UPDATE gwqmshop_process_order_item set gwqmshop_process_order_item.total_weight=1*gwqmshop_process_order_item.count * (
    	
    	SELECT isrc.total_weight/isrc.count as unitWeight from	gwqmshop_process_order_item as isrc 
       where isrc.id=gwqmshop_process_order_item.src_order_item_id 	
    	
    	),
     gwqmshop_process_order_item.total_amount=gwqmshop_process_order_item.total_weight*gwqmshop_process_order_item.price
     where gwqmshop_process_order_item.id in (
    	SELECT item.id from 
      (
    	SELECT it.id  from  gwqmshop_process_order_item as it
     where 
    it.disabled=0 
    	and it.order_id in (
    	SELECT o.id from gwqmshop_process_order o  where o.disabled=0 and o.data_type=3 and o.createtime>'2018-05-26 22:00:00'
    	) 
      ) item
    );
    
    上面的更新语句就会爆错,还是之前的错误,不能通过查询 自身来更新 
    报错:
     You can't specify target table 'gwqmshop_process_order_item' for update in FROM clause
    
    
    
    
    
    
    
    
    

     

     

    上面的办法都不能成功,然后我也乱写了一通,都搞不定,,,都自己的错,写代码写出BUG了,必须执行更新语句,,,自己的坑,自己填。。。

    网上乱看,然后 自己乱写,乱调试:

    最终解决update SQL语句:

    
    UPDATE gwqmshop_process_order_item,gwqmshop_process_order_item units
    
     set gwqmshop_process_order_item.total_weight=1*gwqmshop_process_order_item.count * (units.total_weight/units.count),
     gwqmshop_process_order_item.total_amount=gwqmshop_process_order_item.total_weight*gwqmshop_process_order_item.price
     where gwqmshop_process_order_item.id in (
    	SELECT item.id from 
      (
    	SELECT it.id  from  gwqmshop_process_order_item as it
     where 
    it.disabled=0 
    	and it.order_id in (
    	SELECT o.id from gwqmshop_process_order o  where o.disabled=0 and o.data_type=3 and o.createtime>'2018-05-26 22:00:00'
    	) 
      ) item
    ) and units.id = gwqmshop_process_order_item.src_order_item_id;
    
    
    

     

    原来只需要  update 的是, 再 来一个自身表 即可。

    因为之前 没有这样想是因为 感觉可能是 会 报错,因为查询了自身表又更新了。。。

    - You can't specify target table 'gwqmshop_process_order_item' for update in FROM clause

    因为没有报错,可以成功是因为 mysql 的 底层区分开了吧。

     gwqmshop_process_order_item,gwqmshop_process_order_item units 可能就是两个 不会产生关联的表吧。

     

     

    2.   update 执行,使用SUM() 函数

     

    订单明细表,已经更新了 重量和金额了,那么 还需要 更新 订单主表啊,因为订单主表也有 总的 重量和金额。。。

    看起来挺简单,更加明细表求和,更加即可。

    估计大家一般会这样写:

    ## 再更新订单的 总理论重量和总理论价格
    
    update gwqmshop_process_order 
    set total_weight =(
    sum(
    SELECT it1.total_weight  from  gwqmshop_process_order_item as it1
    where it1.order_id=id and it1.disabled=0
    )
    ),
    set total_price=(
    sum(
    SELECT it2.total_amount  from  gwqmshop_process_order_item as it2
    where it2.order_id=id and it2.disabled=0
    )
    )
    where id in 
    (
     SELECT mo.id from (
    SELECT o.id as id from gwqmshop_process_order o  where o.disabled=0 and o.data_type=3 and o.createtime>'2018-05-26 22:00:00'
    	) as mo
    );

     

    但是 执行之后 报错:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT it1.total_weight  from  gwqmshop_process_order_item as it1
    where it1.ord' at line 4

    语法错误,什么鬼,,,没有错误啊。反正就是不行。

     

    看不问题,我试着简化一下SQL:

    update gwqmshop_process_order ,
    gwqmshop_process_order_item  it1 
    set gwqmshop_process_order.total_weight =sum(it1.total_weight)
    where gwqmshop_process_order.id in 
    (
     SELECT mo.id from (
    SELECT o.id as id from gwqmshop_process_order o  where o.disabled=0 and o.data_type=3 and o.createtime>'2018-05-26 22:00:00'
    	) as mo
    )
    and it1.order_id=gwqmshop_process_order.id and it1.disabled=0
    ;

     

    就爆出来 :

     Invalid use of group function

    看起来 感觉是 使用不了 sum 函数啊。。。

    想想也是,  sum 函数也算分组函数吧,分组求和的。。。

    我们一般使用 sum 函数都是 在 select 语句中的,  没有这样直接使用的。。。

    所以要改一下, 随便试了一下,没成功, 去百度看看

    可以参考: https://stackoverflow.com/questions/653826/update-with-sum-in-mysql

    UPDATE Table_NAme SET PAR= summedValue
    FROM   TAble_NAME t
    JOIN (
      SELECT ID, SUM(S_val) as summedvalue 
      FROM TABLE_NAME GROUP BY ID
      ) s on t.ID = s.ID

     

    这样子 感觉 好像行的通, 可是怎么使用MYSQL 写出来?

     

    试着用join 关联:
    
    update gwqmshop_process_order ,
     inner join 
    (
    SELECT gwqmshop_process_order_item.order_id as order_id ,sum(gwqmshop_process_order_item.total_weight) as sumweight  from gwqmshop_process_order_item
    where gwqmshop_process_order_item.disabled=0 
    ) as itsum on itsum.order_id=gwqmshop_process_order.id
    
    set gwqmshop_process_order.total_weight =itsum.sumweight 
    where gwqmshop_process_order.id in 
    (
     SELECT mo.id from (
    SELECT o.id as id from gwqmshop_process_order o  where o.disabled=0 and o.data_type=3 and o.createtime>'2018-05-26 22:00:00'
    	) as mo
    )
    ;
    
    
    报错。。。
    check the manual that corresponds to your MySQL server version for the right syntax to use near 'inner join 
    (
    SELECT gwqmshop_process_order_item.order_id as order_id ,sum(gwq' at line 2
    
    
    
    
    试试下面的:
    
    update gwqmshop_process_order ,
    (
    SELECT gwqmshop_process_order_item.order_id as order_id ,sum(gwqmshop_process_order_item.total_weight) as sumweight  from gwqmshop_process_order_item
     GROUP BY  gwqmshop_process_order_item.order_id
    ) as itsum
    left  JOIN itsum itsum1 on itsum1.order_id=gwqmshop_process_order.id
    set gwqmshop_process_order.total_weight =itsum1.sumweight
    where gwqmshop_process_order.id in 
    (
     SELECT mo.id from (
    SELECT o.id as id from gwqmshop_process_order o  where o.disabled=0 and o.data_type=3 and o.createtime>'2018-05-26 22:00:00'
    	) as mo
    )
    
    ;
    
    
    
    
     Table 'yxshop.itsum' doesn't exist  报错,还是不行。
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

     

     

    最终解决办法:

    
    于是使用下面的:
    
    
    update gwqmshop_process_order ,
     (
    SELECT gwqmshop_process_order_item.order_id as order_id ,sum(gwqmshop_process_order_item.total_weight) as sumweight,
     sum(gwqmshop_process_order_item.total_amount) as sumamount
      from gwqmshop_process_order_item
     GROUP BY  gwqmshop_process_order_item.order_id
    ) as itsum
    set gwqmshop_process_order.total_weight =itsum.sumweight,
    gwqmshop_process_order.total_price=itsum.sumamount
    
    where gwqmshop_process_order.id in 
    (
     SELECT mo.id from (
    SELECT o.id as id from gwqmshop_process_order o  where o.disabled=0 and o.data_type=3 and o.createtime>'2018-05-26 22:00:00'
    	) as mo
    )
    and  itsum.order_id=gwqmshop_process_order.id
    ;
    

     

    上面的SQL在 mysql 5.6 下面没有问题,

     

    但是在 mysql5.7 下面就报错:

    You can't specify target table 'gwqmshop_process_order' for update in FROM clause
     

    也是奇怪,还好生产环境使用 mysql5.6  

     

    mysql 5.7 的报错,不知道是不是BUG,不然为什么mysql5.6 没事?

    而且从报错的角度来看,,,不知道怎么会出现这样错误??

     

    我也不还知道怎么办了

     

    因为 


    update gwqmshop_process_order
    set total_price=total_price

    where 

    id in 
    (
     SELECT mo.id from (
    SELECT o.id as id from gwqmshop_process_order o  where o.disabled=0 and o.data_type=3 and o.createtime>'2018-05-26 22:00:00'
        ) as mo
    )

    ;
    这样子在 mysql 5.7 下面行不通, 

    有最笨的方式就是 拼出来 执行的所有的 update SQL, 

    先把 所有的订单ID查询出来,然后根据订单id 去更新了,

    也就是 不采用批量更新了,采用 单表更新了。

     

     

     

     

     

     

     

     

    转载于:https://my.oschina.net/ouminzy/blog/1839214

    展开全文
  • update mf_bus_pact p,( select pact_no,pact_amt,sum(putout_amt) as putout_amt from mf_bus_finc_app group by pact_no ) b set p.usable_finc_amt = b.pact_amt - b.putout_amt where p.pact_no = b.pact_no

    update mf_bus_pact p,(
    select pact_no,pact_amt,sum(putout_amt) as putout_amt from mf_bus_finc_app
    group by pact_no
    ) b
    set p.usable_finc_amt = b.pact_amt - b.putout_amt  
    where p.pact_no = b.pact_no

    展开全文
  • 复杂update语句

    千次阅读 2011-11-11 11:24:29
    1 UPDATE DIM_AGENT T  SET T.DUTY_AREA =  (SELECT L.DUTY_AREA  FROM V_MU_AMS_AGENT L  WHERE L.IATA_CODE = T.AGENT_IATA),  T.ADMIN_AREA =  (SELECT L.ADMIN_

    1

    UPDATE DIM_AGENT T

       SET T.DUTY_AREA =
           (SELECT L.DUTY_AREA
              FROM V_MU_AMS_AGENT L
             WHERE L.IATA_CODE = T.AGENT_IATA),
           T.ADMIN_AREA =
           (SELECT L.ADMIN_AREA
              FROM V_MU_AMS_AGENT L
             WHERE L.IATA_CODE = T.AGENT_IATA)
     WHERE EXISTS (SELECT *
              FROM V_MU_AMS_AGENT L
             WHERE L.IATA_CODE = T.AGENT_IATA
               AND L.DUTY_AREA != T.DUTY_AREA)

    2

        UPDATE
        (
          SELECT/*+ bypass_ujvc*/
                 t.exe_company,
                 k.company_cd
            FROM nw_flight_base t,
                 (
                   SELECT a.rowid AS rid, b.company_cd
                     FROM nw_flight_base a,
                          (SELECT t.*,
                                  nvl(lead(apply_dt)
                                      over(PARTITION BY ac_no ORDER BY apply_dt) - 1,
                                      to_date('2999-12-31', 'yyyy-mm-dd')) next_apply_dt
                             FROM sa_aircraft t) b
                    WHERE a.ac_no = b.ac_no
                      AND a.flight_dt BETWEEN b.apply_dt AND b.next_apply_dt
                      AND a.flight_dt BETWEEN p_flight_dt_from AND p_flight_dt_to
                  ) k
          WHERE t.rowid = k.rid
        ) SET exe_company = company_cd;


    展开全文
  • 自己总结网上的多种示例,对下面几种情况的处理  1.对部分元素的改动,只传...public User update(String id, Map<String, Object> updateFieldMap) { if (updateFieldMap != null || !updateFiel...
  • mysql的update复杂语句

    2021-05-27 10:03:08
    UPDATE t_s_user a ,(SELECT ur.id,bu.username,bu.realname,ur.roleids, (SELECT r.rolename FROM t_s_role r WHERE r.id IN(IFNULL(ur.roleids,''))) rolenames from t_s_base_user bu LEFT JOIN ( SELECT u...
  • mongodb复杂的更新操作: 把一张表如果group by某个字段的数量 大于5的数据对应的另外一张表进行更新。 类似以下的sql语句功能: update from 表1 set 表1.字段1 = 'yes' where 表1.code in ( select 表2....
  • 一条比较复杂update sql语句

    千次阅读 2017-11-30 17:37:58
    思考一条update语句完成更新操作 已有的表: 一张电压表(电压id,具体电压) 母线表,线路表,主变表 主变圈阻表 select * from T_CIM_ACLINESEGMENT -- 线路表 select * from T_CIM_BASEVOLTAGE --
  • 有朋友问我一个update语句,下面两种写法哪个性能更高,一个是没HINT的,一个是有HINT的 [html] view plaincopyprint? UPDATE CS_PERFORMANCE_CURRENT C   SET C.PERFORMANCE_SCORE =...
  • merge into dw_cmcc_split_detail_t a using (  select t.id,  t.cp_id,  t.cp_name ...when matched then update set a.cp_id=ng.cp_id,a.cp_name=ng.cp_name where a.business_date='20120101'
  • 数据库有两张表 build_info 和 build_info2,两张表单的结构是一样的,现在build_info表一个字段shop_money数据出错了,我需要把表2的这个字段数据更新到表一中,但是只需要更新用户test3在该字段的数据是零情况下的...
  • mysql实现复杂UPDATE语句(子查询)

    千次阅读 2018-12-14 15:29:56
    update student_continue_intervals sc,(SELECT sci.STUDENT_ID,sci.WEEK_DAY,sci.`START`,sci.`END` from student s INNER JOIN ts_relationship tsr ON s.ID = tsr.STUDENT_ID AND tsr.R_TYPE = 0 INNER JOIN stu....
  • UPDATE test_info ti JOIN ( SELECT al.unit_price_tax, al.amount, al.unit_price_tax * apll.amount AS line_amount, al.line_id FROM ac_line al JOIN test_info ti ON ti.line_id = al.ledger_id )...
  • 方法2:没有给出update 致谢:itpub 斑竹oldwain 如果列数有限, 那么像下面这样就行了: scott@O9I.US.ORACLE.COM > select a0.id, 2 nvl(t1.tocode, code1), 3 nvl(t2.tocode, code2), 4 nvl(t3.tocode, code3), 5...
  • sql server 2005 select update 复杂计算 批量更新 表结构如上图:ID,日期,代码,开盘,最高,最低,振幅3 求:前三日的振幅,并批量更新。 算法:代码相同,按日期排序,向前取三条,从最高里面找到最大的数,从...
  • 由于差价的修改比较复杂(T_b表中省略了很多字段),所以来请教一下。需要通过T_b中的字段“a”和字段“b”的值来比较,然后再做相应操作。请问这种情况下一般怎么做??? 说明:第一个要修改的值一条sql语句就...
  • 药品编号) 另外一种写法update set from: update table1 set field1=table2.field1, field2=table2.field2 from table2 where table1.id=table2.id Oracle写法: UPDATE NS_NATION_BODY_IMP t1 SET (LEGAL_...
  • mongodb update

    千次阅读 2013-04-28 09:19:05
    语法很简单,但是使用起来,要配合一些函数,就会复杂一些,解释一下 query:条件限定,也就是需要更新行的条件,相当于SQL中where后面的条件判断 update:相当于SQL表中的set语句 options:这里需要注意的是...
  • GrindingWheelInformationDA.Update(ds, "GrindingWheelInformation");//这边报错,提示数据库查询过于复杂 listView1.Items.Remove(listView1.SelectedItems[0]); MessageBox.Show("删除完毕!!!"); } } ...
  • 最近突然遭遇许多复杂表单,于是干上了。 一直有种说法:table用于数据表,对于复杂表单,table也是最好的选择,由于一直没有遇见过也就没有认真去研究,到底复杂表单是否应该使用table。 好了,机会来了,我拿着...
  • mongo update

    2016-11-07 14:41:49
    查询的语法”里,我介绍了Mongodb的常用查询语法,Mongodb的update操作也有点复杂,我结合自己的使用经验,在这里介绍一下,给用mongodb的朋友看看,也方便以后自己用到的时候查阅: 注:在这篇文章及上篇文章内...
  • UPDATE 问题

    千次阅读 2011-12-14 22:36:12
    Update的概述:复杂的索引要求,效率优化 隐藏在update后面的约束 定义用于更新其他数据集的数据为源数据,被更新的数据称为目标数据,原数据集合与目标数据之间的关联键,在源数据集中一定唯一。不会存在着...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,646
精华内容 1,058
关键字:

复杂update