在sql里面如何实现关联表数据的更新

在sql里面如何实现关联表数据的更新,第1张

1建个触发器

2建立个物化试图(速度快)

CREATE MATERIALIZED VIEW LOG ON name--建立物化视图日志保存在特定的表空间

tablespace users; --指定表空间

drop materialized view name;

create materialized view name--创建物化试图

refresh fast

on commit --在提交后立即刷新

as

select

A

from tablename A

我好像昨天回答过,你不相信可以上机测试:

UPDATE 表1 SET address=(SELECT 表2address from 表2 WHERE 表2name=表1name)

上面的语句非常简单,很容易明白,语句工作时,扫描表1的所有记录,对于每一条记录,按照name去查找表2的address并替换本表此字段。

ACCESS数据库是可以用两个表关联的结果来更新其中一列表的。但是由于ACCESS Jet引擎功能较弱,它只能用数据表中实际存在的列的值来更新其中一张表,对于计算得来的列的列值是无法用于更新的,哪怕是事前将有查询关语句保存为一个固定名称的查询也不成。

例如

update T2 a,(select A,count(A) as cnt from T1 group by A) b 

set aC=bcnt where bA=aA;

或者将其中的子查询“select A,count(A) as cnt from T1 group by A” 保存为查询“Q1”

上述语句改写如下

update T2 a,Q1 b set aC=bcnt where bA=aA;

上述两句的语法都没问题,但是无法执行(报错必须有可更新的查询)

这么办?因为cnt列是计算得来的,Jet无法利用该列更新T2的字段C,那我们就利用一张中间表T3来绕过这个限制。

先运行生成表查询,将上述子查询结果保存为表“T3”

select A,count(A) as cnt into T3 from T1 group by A;

再运行下列更新即可实现楼主的需求

update T2 a,T3 b set aC=bcnt where bA=aA;

如果以后要经常运行该 *** 作,请先运行一下面两个动作查询来更新之前T3表里已有的数据,以免旧有数据影响更新查询的正确性。

1清空旧数据

delete from T3;

2存入新的子查询结果

insert into T3 SELECT A,count(a) as cnt from T1 group by A;

3执行更新查询,更新T2表的C列

update T2 a,T3 b set aC=bcnt where bA=aA;

确实有些麻烦,但是目前暂时还未能找到不借助中间T3表的SQL语句解决方案。

其实更新T2表的C列有些多余,因为我们可以非常方便地用选择查询得到你要的列表

select aid,aA,Nz(bcnt,0) as C from T2 a left join 

(select A,count(A) as cnt from T1 group by a) b 

on bA=aA;

一句选择查询就搞定了,实在是没必要去花大把的精力来维护这个C列!

UPDATE多表更新(转)(2008-05-12 15:29:04)

转载标签:update多表更新sql 分类:php网络编程

在开发中,数据库来回换,而有些关键性的语法又各不相同,这是一件让开发人员很头痛的事情本文总结了Update语句更新多表时在SQL Server,Oracle,MySQL三种数据库中的用法我也试了SQLite数据库,都没成功,不知是不支持多表更新还是咋的

在本例中: 我们要用表gdqlpj中的gqdltks,bztks字段数据去更新landleveldata中的同字段名的数据,条件是当 landleveldata 中的GEO_Code字段值与gdqlpj中的lxqdm字段值相等时进行更新

SQL Server语法:UPDATE { table_name WITH ( < table_hint_limited > [ n ] ) | view_name | rowset_function_limited } SET { column_name = { expression | DEFAULT | NULL } | @variable = expression | @variable = column = expression } [ ,n ] { { [ FROM { < table_source > } [ ,n ] ] [ WHERE < search_condition > ] } | [ WHERE CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } [ OPTION ( < query_hint > [ ,n ] ) ]

SQL Server示例: update a set agqdltks=bgqdltks,abztks=bbztks from landleveldata a,gdqlpj b where aGEO_Code=blxqdm

Oracle语法: UPDATE updatedtable SET (col_name1[,col_name2])= (SELECT col_name1,[,col_name2] FROM srctable [WHERE where_definition])

Oracel 示例: update landleveldata a set (agqdltks, abztks)= (select bgqdltks, bbztks from gdqlpj b where aGEO_Code=blxqdm)

MySQL语法: UPDATE table_references SET col_name1=expr1 [, col_name2=expr2 ] [WHERE where_definition]

MySQL 示例: update landleveldata a, gdqlpj b set agqdltks= bgqdltks, abztks= bbztks where aGEO_Code=blxqdm

mssql 触发器自动更新

CREATE TRIGGER 入库表修改 ON 入库表

FOR UPDATE

AS

SET NOCOUNT ON

if update(入库数量)

begin

update 库存表 set 库存数量=isnull(a入库数量,0)-isnull(b入库数量,0)-isnull(c出库数量,0)

from 入库表 a,deleted b,出库表 c where a型号=b型号 and a型号=c型号

update 库存表 set 库存数量=isnull(a入库数量,0)+isnull(b入库数量,0)-isnull(c出库数量,0)

from 入库表 a,inserted b,出库表 c where a型号=b型号 and a型号=c型号

end

SET NOCOUNT OFF

go

CREATE TRIGGER 出库表修改 ON 出库表

FOR UPDATE

AS

SET NOCOUNT ON

if update(出库数量)

begin

update 库存表 set 库存数量=isnull(a入库数量,0)-isnull(c出库数量,0)+isnull(b出库数量,0)

from 入库表 a,deleted b,出库表 c where a型号=b型号 and a型号=c型号

update 库存表 set 库存数量=isnull(a入库数量,0)-isnull(c出库数量,0)-isnull(b出库数量,0)

from 入库表 a,inserted b,出库表 c where a型号=b型号 and a型号=c型号

end

SET NOCOUNT OFF

以上就是关于在sql里面如何实现关联表数据的更新全部的内容,包括:在sql里面如何实现关联表数据的更新、mysql两个表关联更新问题、请教数据库高手,在access2003里,用sql语句查询实现两表关联查询用count更新其中一表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10090697.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存