原文链接:https://blog.csdn.net/WuLex/article/details/84139590

对于有的更新语句,要更新的表可能条件不够,需要用到left join关联其他表,

但是不能直接关联,否则报错:错误如下:

update  imim_gireqbillitems gi
left join imim_gireqbills g on g.guid=gi.guid
set gi.quantity=
(select sum(gi2.quantity)from imim_gireqbillitems gi2left join imim_gireqbills g2 on g2.guid=gi2.guidwhere g2.ismerge='0' and g2.mergeid=g.mergeid
)
where g.ismerge='1' and exists
(select 1from imim_gireqbillitems gi2left join imim_gireqbills g2 on g2.guid=gi2.guidwhere g2.ismerge='0' and g2.mergeid=g.mergeid
)

正确实例:

update
(select * from imim_gireqbillitems gi left join imim_gireqbills g on g.guid=gi.guidwhere g.ismerge='1'
) T
set T.quantity=
(select sum(gi2.quantity)from imim_gireqbillitems gi2left join imim_gireqbills g2 on g2.guid=gi2.guidwhere g2.ismerge='0' and g2.mergeid=T.mergeid
)
where exists
(select 1from imim_gireqbillitems gi2left join imim_gireqbills g2 on g2.guid=gi2.guidwhere g2.ismerge='0' and g2.mergeid=T.mergeid
)

Oracle中的 UPDATE FROM 解决方法

在表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。像sql server提供了update的from子句,可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式中引用要更新的表以外的其它数据。
例如:

UPDATE Table2
SET Table2.ColB = Table2.ColB + Table1.ColB
FROM Table2
INNER JOIN Table1
ON (Table2.ColA = Table1.ColA);

实际更新的操作是在要更新的表上进行的,而不是在from子句所形成的新的结果集上进行的。

Oracle没有update from语法,可以通过两种写法实现同样的功能:

1:子查询UPDATE A SET A.NAME=(SELECT B.NAME FROM B WHERE B.ID=A.ID),本查询要根据具体情况看看是否变通成如下

(1)单列

UPDATE A
SET A.NAME=(SELECT B.NAME FROM B WHERE B.ID=A.ID)
WHERE A.ID IN (SELECT ID FROM B);

(2)多列

UPDATE order_rollup
SET(qty,price)=(SELECT SUM(qty),SUM(price) FROM order_lines WHERE customer_id='KOHL' )
WHERE cust_id='KOHL' AND order_period=TO_DATE('01-Oct-2000')

2:利用视图来做

UPDATE (SELECT A.NAME ANAME,B.NAME BNAME FROM A,B WHERE A.ID=B.ID)
SET ANAME=BNAME;

例如:

UPDATE tablea a
SET a.fieldforupdate = (SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield)
WHERE EXISTS (SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield)

有三点需要注意:

对于一个给定的a.keyfield的值,SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield 的值只能是一个唯一值,不能是多值。
在绝大多数情况下,最后面的where EXISTS子句是重要的,否则将得到错误的结果。
对于视图更新的限制:
如果视图基于多个表的连接,那么用户更新(update)视图记录的能力将受到限制。除非update只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。

SQL update left join查询相关推荐

  1. sql update left join

    UPDATE b SET b.Address = a.ADDRESS ,b.lot = a.lot ,b.lat = a.lat FROM VisitPharmacy_StoreLocation aL ...

  2. 关于My Sql update语句不能用子查询的解决办法

    在使用My Sql数据库语法操作update时,第一时间想到的是一下写法: UPDATE purchase_request_detail SET convert_to_voucher_id=2, co ...

  3. SQL性能下降原因及Join查询

    原因 查询语句写得烂 索引失效 关联查询过多(设计缺陷) 服务器调优及各个参数设置(缓冲.线程数等) Join查询的SQL执行顺序 手写 SELECT <select_list> FROM ...

  4. 【转载】SQL中使用update inner join和delete inner join

    原文地址:SQL中使用update inner join和delete inner join Update XXX set XXX where 这种写法大家肯定都知道,才发现update和delete ...

  5. sql之left join、right join、inner join的区别,连接自己时的查询结果测试

    sql之left join.right join.inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录  right join(右联接) 返回包 ...

  6. SQL UPDATE with INNER JOIN

    mysql - SQL UPDATE with INNER JOIN - Stack Overflow https://stackoverflow.com/questions/14491042/sql ...

  7. SQL JOIN TABLES:在SQL Server中使用查询

    In this article, you will see how to use different types of SQL JOIN tables queries to select data f ...

  8. 一条SQL完成跨数据库实例Join查询

    2019独角兽企业重金招聘Python工程师标准>>> 背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型 ...

  9. sql重复数据只保留一条_一条SQL完成跨数据库实例Join查询

    背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...

最新文章

  1. MySQL查询优化:LIMIT 1避免全表扫描
  2. 程序猿小白应该注意什么
  3. Linux文本处理之printf:规定输出内容与样式 %规定内容样式 \规定排版样式
  4. 你所阅读的,决定你是什么样的人
  5. PageHelper分页时超过最大数量的页数仍然返回数据,PageHelper分页失效
  6. LeetCode刷题(19)
  7. Django ORM QuerySet集合对象的特性
  8. Linux 离奇磁盘爆满,如何解决? | 原力计划
  9. Qt 设置窗体大小和背景颜色
  10. Tensor的Broadcasting操作
  11. L2-001. 紧急救援(PAT)~最短路应用
  12. firebug的调试,console
  13. decimal简单问题
  14. flex acionscript png图片去除多余空白,生成合适大小图片
  15. Android获取横竖屏状态及监听
  16. qpython3怎么运行代码_关于使用qpython和qpython3写程序
  17. 【智库解读】明天系、安邦系、海航系、复星系、联想系、中植系、三胞系、宝能系等27个超级民营金融巨头名单及其持股图揭秘!
  18. oracle存储过程报ORA-20000的错误
  19. 软件测试团队口号及队名,团队队名口号(精选50句)
  20. 深入理解模型视图、自定义模型

热门文章

  1. 企业内部薪酬差距测算2005-2021年(数据+代码)管理层平均薪酬VS员工平均薪酬
  2. H5app录制语音并上传服务器demo
  3. 从数据中台实践,浅谈数据质量管理
  4. c语言编程网页数据提取,怎么用c语言抓取网页中的数据
  5. 全国首个珠贝交易市场鄱湖珠贝城走上金算盘全程电子商务之路
  6. ssh命令行远程连接服务器跑程序新手教程
  7. NYOJ55 懒省事的小明【multiset的用法】
  8. java js 二级联动下拉列表_二级联动下拉列表JS+html实现
  9. 《你不知道的JavaScript上卷》知识点整理与读书笔记
  10. 卷上卷队——钟某人的python刷题day8——100道python例题