通过子查询进行UPDATE
来源:互联网 发布:王毅外交上的幼稚知乎 编辑:程序博客网 时间:2024/05/13 04:39
目的:更新父表的字段值,且要更新其子表的相关字段值(备注:没有在子表上建外键)。
方法:先建个临时表(和父表的数据一模一样,也可以看成是父表的备份表),然后根据子查询进行UPDATE。
示例:
父表:test.dbo.dept
子表:test.dbo.emp
父表,子表查询结果:
步骤:
1:查看哪些子表用到了test.dbo.dept的deptno
可以通过这个存储过程:
--存储过程创建语句(这是我同事写的)
USE [DBA]
GO
/****** Object: StoredProcedure [JCW].[Find_Column_Data] Script Date: 2014/2/19 14:04:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
查找全服务器中使用到此列名的表及是否有表值的信息
20130716
江成威
*/
CREATE PROC [JCW].[Find_Column_Data]
(
@ColumnName nvarchar(200),
@Data nvarchar(max)=NULL
)
AS
begin
CREATE TABLE #NCTables
(
Num INT IDENTITY(1,1),
TableFullName NVARCHAR(500),
HasColumnData BIT DEFAULT 0
)
DECLARE @SS nvarchar(max)='
use ?;
INSERT INTO #NCTables
( TableFullName, HasColumnData )
SELECT ''[?].[''+S.name+''].[''+T.name+'']'',0 FROM sys.columns C INNER JOIN sys.tables T ON C.object_id=T.object_id INNER JOIN sys.schemas S ON S.schema_id=T.schema_id WHERE C.name='''+@ColumnName+''';
'
EXEC sys.sp_MSforeachdb @SS
--SELECT * FROM #NCTables
--DROP TABLE #NCTables
DECLARE @Num int =(SELECT MAX(Num) from #NCTables)
DECLARE @TBName NVARCHAR(500)
DECLARE @SQL NVARCHAR(max)
DECLARE @where NVARCHAR(max) = (CASE WHEN @Data IS NULL THEN '' ELSE ' where '+@ColumnName+'='''+@Data+'''' END)
WHILE @Num>0
BEGIN
SELECT @TBName=TableFullName FROM #NCTables WHERE num=@Num
SET @SQL='if (select count(0) from '+@TBName+' '+@where+')>=1
begin
update #NCTables set HasColumnData=1 where Num='''+cast(@Num AS nvarchar(20))+'''
end
'
PRINT @sql
EXEC (@sql)
SET @Num=@Num-1
END
SELECT * FROM #NCTables
END
GO
EXEC DBA.JCW.Find_Column_Data @ColumnName = N'deptno', -- nvarchar(200) 字段名称
@Data = N'' -- nvarchar(max) 字段值
--结果:
test.dbo.emp
--2 对这两个表进行备份:
USE dba;
SELECT *
INTO dept_bak_bdd_201402191726
FROM TEST.DBO.DEPT;
SELECT *
INTO emp_bak_bdd_201402191726
FROM TEST.DBO.EMP
--3 更新dept表
UPDATE dept
SET deptno=40
WHERE deptno=30;
--4 根据子查询更新emp
UPDATE TEST.DBO.EMP
SET deptno=c.deptno
--SELECT A.deptno,c.deptno,B.dNAME
FROM TEST.DBO.EMP A
INNER JOIN DBA.dbo.dept_bak_bdd_201402191726 B ON B.deptno=A.deptno
INNER JOIN TEST.DBO.DEPT C ON B.dName=C.dNAME
--5 验证
SELECT *
FROM test.dbo.EMP;
所有deptno为30的现都已改成了40.
- 通过子查询进行UPDATE
- Update 关联子查询
- update子查询
- MySQL UPDATE子查询
- mysql update 子查询
- pl/sql update子查询
- mysql update from 子查询
- mysql update使用子查询
- mysql update使用子查询
- mysql update in 嵌套子查询更新
- UPDATE、DELETE 语句中的子查询
- update时使用子查询出错
- UPDATE子查询的ORA-1779错误
- mysql update 无法使用子查询。。。
- mysql update in 嵌套子查询更新
- Mysql update 子查询锁表问题。
- MySQL数据库update更新子查询
- Mysql update 子查询锁表问题。
- Solr4.4的安装与配置
- log4j
- 手把手教你玩转GDB(一)—牛刀小试:启动GDB开始调试
- apk反编译查看*.java,AndroidManifest.xml,布局xml文件
- 结构体
- 通过子查询进行UPDATE
- C++中5个内存区的区别以及栈和堆的详细比较
- jBPM5 入门
- 《MongoDB权威指南》学习整理----MongoDB文档增加、删除及更新
- Vista或Win7远程桌面连接速度慢的问题
- 又是一年雨季
- winscp 上传文件时,排除svn文件
- Binary Search Tree/ Binary Sorted Tree —— BST
- java.lang.ClassNotFoundException: javax.persistence.EntityListeners