update sql 两个关联的表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了update sql 两个关联的表相关的知识,希望对你有一定的参考价值。

select * from spkfk b ,hwsp a where hw='HWI00000001' and hwshl>0 and a.spid=b.spid and tongym like'%2'

我已经把条件选择出来了,但是想把,A表里的hwshl更新成0,条件就是where后边的

一、当用一个表中的数据来更新另一个表中的数据,T-SQL提供多种写法(下面列出了二种),但建议用第一种写法,虽然传统,但结构清晰。
并且要注意,当用一个表中的数据来更新另一个表中的数据时,二个表一定要有关联!
1.
update t1
    set t1.c2 = t2.c2
   fro m t2
where t1.c1 = t2.c1
2.
Update t1
    set t1.c2 = t2.c2
fro m t1 inner join t2
    on t1.c1 = t2.c1
二、FROM 子句中指定的表的别名不能作为 SET column_name 子句中被修改字段的限定符使用。
  例如,下面的内容无效:
UPDATE titles
SET t.ytd_sales = t.ytd_sales + s.qty
FROM titles t, sales s
WHERE t.title_id = s.title_id
AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)
若要使上例合法,请从列名中删除别名 t 或使用本身的表名。
1.
UPDATE titles
SET ytd_sales = t.ytd_sales + s.qty
FROM titles t, sales s
WHERE t.title_id = s.title_id
AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)
2.
UPDATE titles
SET titles.ytd_sales = t.ytd_sales + s.qty
FROM titles t, sales s
WHERE t.title_id = s.title_id
AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)
参考技术A

看结果应该是使用Union ALL合并查询结果,而不是表关联

示例

select * from 表A
union all
select * from 表B

表A和表B的列格式必须一致,且数量一致

参考技术B update hwsp
set hwshl = 0
from hwsp , spkfk b
where hw='HWI00000001' and hwshl>0 and hwsp.spid=b.spid and tongym like'%2'本回答被提问者采纳
参考技术C update hwsp a,spkfk b set a.hwshl=o where b.hw='HWI00000001' and b.hwshl>0 and b.tongym like'%2' and a.spid=b.spid 参考技术D Update hwsp
set hwshl=0
from spkfk b
where hw='HWI00000001' and hwshl>0 and a.spid=b.spid and tongym like'%2'

Update关联查询不走索引,效率低下

   这两天优化一个sql,就是有A,B两个表,要利用b表的字段更新a表对应的字段。形如

Sql代码  

  1. update A set A.a=(select B.b from B where A.id=B.id);  



原SQL

updatepntmall_rptpoint_detail a set a.scrm_rptpnt_processed=(

select distinctb.scrm_rptpnt_processed  frompntmall_rptpoint_detail_tmp b where a.pntmall_rptpnt_id=b.pntmall_rptpnt_id

);


b表中只有1条数据,a表中有37万条数据,应用逻辑为更新a表中id和b表相同的

这一条SQL执行了6小时未执行完,执行计划显示为全表扫描,也就是说,虽然执行1条SQl,但执行update个过程中将37万条数据进行扫描,直到倒找相同的id进行更新


尝试过hit强制走索引,也不理想,where条件中id列类型是相同的均为INT,不存在字段类型不同导致不走索引的情况。


采取的方式:

优化后的SQL

updatepntmall_rptpoint_detail a set a.scrm_rptpnt_processed=(

select distinctb.scrm_rptpnt_processed  frompntmall_rptpoint_detail_tmp b where a.pntmall_rptpnt_id=b.pntmall_rptpnt_id

) wherea.pntmall_rptpnt_id in (select b.pntmall_rptpnt_id frompntmall_rptpoint_detail_tmp b)


优化后的SQL达到秒级,满足客户需求。


总结一下不走索引的情况:

1、条件字段选择性弱,查出的结果集较大,不走索引;

2、where条件等号两边字段类型不同,不走索引;

3、优化器分析的统计信息陈旧也可能导致不走索引;

4、索引字段 is null 不走索引;

5、对于count(*)当索引字段有not null约束时走索引,否则不走索引;

6、like 后面的字符当首位为通配符时不走索引;

7、使用不等于操作符如:<>、!= 等不走索引;

8、索引字段前加了函数或参加了运算不走索引;


以上是关于update sql 两个关联的表的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 能不能用一条语句将两个关联的表,更新其中一个表的一字段

ORACLE中如果两个字段如果能关联的语句怎么写

update 两个表关联 更新

两个表之间关联更新字段

update 更新多个表 SQL

sql语句:一个表和另外两个表的关联语句