日期:2014-05-19  浏览次数:20512 次

如何对照结构一样的两个表,把A表中有的数据而B表没的数据加到B表中?
标题可能说得不太明白。。我这里再说清楚点。
实际上是一个成绩表,因为同事进行计算总评时条件没有设置好。。导置一些科目原来已经有的分数全没了。。而且之前两天没有备份,所以现在准备用两天前的备份来进行对比。。

成绩表是这样的,主要是   总评成绩   这个字段。。。我先用把备份还原成另外一个数据库,如表名叫   成绩表_bak,把这个表和搞错了的表进行对比,如果   成绩表_bak   中总评是有数据的,而   成绩表   中是没数据的,则用   成绩表_bak   中的成绩更新到   成绩表中。。。

PS:想问问如果不少心用DELETE   或者   UPDATE语句做错了事,之前又没有备份。。有没有办法挽救?谢谢

------解决方案--------------------
insert into 成绩表(总评) select 总评 from 成绩表_bak where 成绩表.id=成绩表_bak.id and 成绩表.总评 is null
------解决方案--------------------
看你情況,應該不是插入,而是更新。

“B库”為你另外一個庫的名稱,假設ID為你的成绩表的主鍵。

Update A
Set 总评成绩 = B.总评成绩
From 成绩表 A Inner Join B库.dbo.成绩表_bak B
On A.ID = B.ID
------解决方案--------------------
轉一下
http://community.csdn.net/Expert/topic/5280/5280851.xml?temp=.0048334
這個帖子中
libin_ftsafe(子陌红尘:当libin告别ftsafe)
的回復。


2、用Log Explorer

Log Explorer

http://www.ttdown.com/SoftDown.asp?ID=14562
http://www.yiii.net/app/servlet/net.yiii.club.DownloadServlet?Information_Id=I00023471
解压缩密码 www.heibai.net

http://www.ttdown.com/softview_8647.htm


注册机产生的是注册码,是两个

用解压缩密码解开后,压缩包里也有一个注册机的

打开log explorer file=> attach log file-> 选择服务器和登陆方式-> connect->
选择数据库-> attach-> 左面对话框中browse-> view log-> 就可以看到log记录了
想恢复的话: 右键log记录 undo transation-> 选择保存文件名和路径-> 然后打开该文件到查询分析器里执行
T-sql代码就可以了

例如 如果log是delete table where ...的话,生成的文件代码就是insert table ....

log explorer使用的几个问题

1)对数据库做了完全 差异 和日志备份
备份时选用了删除事务日志中不活动的条目
再用Log explorer打试图看日志时
提示No log recorders found that match the filter,would you like to view unfiltered data
选择yes 就看不到刚才的记录了


如果不选用了删除事务日志中不活动的条目
再用Log explorer打试图看日志时,就能看到原来的日志

2)修改了其中一个表中的部分数据,此时用Log explorer看日志,可以作日志恢复

3)然后恢复备份,(注意:恢复是断开log explorer与数据库的连接,或连接到其他数据上,
否则会出现数据库正在使用无法恢复)
恢复完后,再打开log explorer 提示No log recorders found that match the filter,would you like to view unfiltered data
选择yes 就看不到刚才在2中修改的日志记录,所以无法做恢复.


3)
不要用SQL的备份功能备份,搞不好你的日志就破坏了.

正确的备份方法是:
停止SQL服务,复制数据文件及日志文件进行文件备份.

然后启动SQL服务,用log explorer恢复数据


------解决方案--------------------
go
if object_id( 't1 ') is not null
drop table t1
go
create table t1(year int ,month int)
insert t1 select 2008,1
union all select 2008,3
go
if object_id( 't2 ') is not null
drop table t2
go
create table t2(year int,month int)
insert t2 select 2008,1
union all select 2008,2
union all select 2008,4
go
select * from t1
select * from t2
go
insert into t2
select * from t1 where month not in (select month from t2 )
go
insert into t2
select * from t1 where not exists (select month from t2 where t2.month = t1.month)
------解决方案--------------------
用checksum()函数可以比较两个个结构完全相同的表的数据。

如:

--查找A表中有,而B中没有的数据

select *
from A
where checksum(*) not in (select checksum(*) from B)