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) bset 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更新其中一表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)