关于SQL UPDATE关联更新
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于SQL UPDATE关联更新相关的知识,希望对你有一定的参考价值。
下面的那个查询出来的数据 根据ID关联上面的表,我现在要根据ID关联,把下面的数据更新给上面的Gmoney字段,如果用update set=select 这种形式,由于select查询出来的是数据集,所以更新失败,我又不想用游标,请问,用函数批处理怎么做?
分析如下
1、【如果存在测试临时表,则先删除,便于重复执行SQL】:
IF OBJECT_ID('tempdb..#SourceTable1') IS NOT NULL DROP TABLE #SourceTable1;
IF OBJECT_ID('tempdb..#SourceTable2') IS NOT NULL DROP TABLE #SourceTable2;
IF OBJECT_ID('tempdb..#UpdateTable') IS NOT NULL DROP TABLE #UpdateTable;
2、【创建源表1】:
CREATE TABLE #SourceTable1(
Id UNIQUEIDENTIFIER,
SCode VARCHAR(50),
SName NVARCHAR(100),
Remark NVARCHAR(500)
)
3、【创建源表2】:
CREATE TABLE #SourceTable2(
Id UNIQUEIDENTIFIER,
SCode VARCHAR(50),
SAttr1 VARCHAR(100),
SAttr2 VARCHAR(100)
)
4、【创建需要更新数据的表】:
CREATE TABLE #UpdateTable(
Id UNIQUEIDENTIFIER,
SCode VARCHAR(50),
SName NVARCHAR(100),
SAttr1 VARCHAR(100),
SAttr2 VARCHAR(100)
)
5、【插入源表1测试数据】:
INSERT INTO #SourceTable1(Id, SCode, SName, Remark) VALUES(NEWID(), 'SCode1', '更新名字1', '更新测试备注1');
INSERT INTO #SourceTable1(Id, SCode, SName, Remark) VALUES(NEWID(), 'SCode2', '更新名字2', '更新测试备注2');
INSERT INTO #SourceTable1(Id, SCode, SName, Remark) VALUES(NEWID(), 'SCode3', '更新名字3', '更新测试备注3');
-- 查询插入的结果
SELECT * FROM #SourceTable1
6、【插入源表2测试数据】:
INSERT INTO #SourceTable2(Id, SCode, SAttr1, SAttr2) VALUES(NEWID(), 'SCode1', 'SCode1-更新属性1', 'SCode1-更新属性2');
INSERT INTO #SourceTable2(Id, SCode, SAttr1, SAttr2) VALUES(NEWID(), 'SCode2', 'SCode2-更新属性1', 'SCode2-更新属性2');
-- 查询插入的结果
SELECT * FROM #SourceTable2
7、【插入#UpdateTable的原始记录】:
INSERT INTO #UpdateTable(Id, SCode, SName, SAttr1, SAttr2) VALUES(NEWID(), 'SCode1', '名字1', 'SCode1-属性1', 'SCode1-属性1');
INSERT INTO #UpdateTable(Id, SCode, SName, SAttr1, SAttr2) VALUES(NEWID(), 'SCode2', '名字2', 'SCode2-属性2', 'SCode2-属性2');
INSERT INTO #UpdateTable(Id, SCode, SName, SAttr1, SAttr2) VALUES(NEWID(), 'SCode3', '名字3', 'SCode3-属性3', 'SCode3-属性3');
-- 查询插入的结果
SELECT * FROM #UpdateTable
8、【使用联合查询,将#UpdateTable、源表1、2中相同SCode的行字段更新到表#UpdateTable】:
UPDATE ut
SET ut.SName = sc1.SName,
ut.SAttr1 = sc2.SAttr1,
ut.SAttr2 = sc2.SAttr2
FROM #UpdateTable ut, #SourceTable1 sc1, #SourceTable2 sc2
WHERE ut.SCode = sc1.SCode
AND ut.SCode = sc2.SCode
-- 查询插入的结果
SELECT * FROM #UpdateTable
扩展资料
SQL Aggregate 函数
SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。
有用的 Aggregate 函数:
1、AVG() - 返回平均值
2、COUNT() - 返回行数
3、FIRST() - 返回第一个记录的值
4、LAST() - 返回最后一个记录的值
5、MAX() - 返回最大值
6、MIN() - 返回最小值
7、SUM() - 返回总和
SQL Scalar 函数
SQL Scalar 函数基于输入值,返回一个单一的值。
有用的 Scalar 函数:
1、UCASE() - 将某个字段转换为大写
2、LCASE() - 将某个字段转换为小写
3、MID() - 从某个文本字段提取字符
4、LEN() - 返回某个文本字段的长度
5、ROUND() - 对某个数值字段进行指定小数位数的四舍五入
6、NOW() - 返回当前的系统日期和时间
7、FORMAT() - 格式化某个字段的显示方式
参考资料:百度百科 sql的相关函数
参考技术A UPDATE ASET A.Gmoney = B.Gmoney
FROM 上表 A
JOIN 关联查出来的表 B ON A.ID = B.ID 参考技术B update table1 set
table1.gmoney = table2.gmoney
from table1,table2
where table1.empid = table2.empid
其中table1为第一个表,table2为第二个表,table2.gmoney为你图中的无列名那一列 参考技术C update 表一 set Gmoney = 表二.列名 from 表一,表二 where 表一.EMPID = 表二.EMPID本回答被提问者和网友采纳 参考技术D 如果是mysql的话,可以用
update A, B
set A.Gmoney= B.Gmoney
where
A.ID= B.ID
Oracle数据库,关于关联两张表更新问题
如有主表A,子表B,当主表A对应的子表B数据条数不为0,并且,所有子表B的数据中某字段(如status)都为30时,则更新主表A的status字段为30.。非常感谢
两表关联更新用如下方法。
有以下两张表:
根据test2表中的id和test1表中的id关联,修改test1表中name字段,语句如下:
update test1 a set a.name=(select b.name from test2 b where a.id=b.id) where a.id in (select id from test2);
更新后,test1表中结果:
参考技术A --因为没有给出a、b两个表的关联,所以用a.id和b.aid做了关联update a aa set status=30
where
(select count(status) from b where a.id=b.aid)>0 --确定b表有A表子数据
and
(select count(status) from b where a.id=b.aid and b.status<>30)=0--b表子数据status<>30个数=0个,说明子数据status全部为30本回答被提问者采纳
以上是关于关于SQL UPDATE关联更新的主要内容,如果未能解决你的问题,请参考以下文章