新手问一个关于sql插入、修改、删除的问题
有表A(id,name,area,pay....)、表B(id,name,area),表中id字段为关键字段
要把符合条件pay=n的表A的记录插入表B,如果B中有记录的id和要插入的数据id相同,则判断name、area是否一致,不一致则修改B的那条记录的name、area,一致则不操作;如果表B中记录的id在表A中已经没有,则删除该条B中该记录
我该怎么写上述条件的过程?如果表中有上百万数据的话,哪种方法快?求助
问题点数:40、回复次数:16Top
1 楼huangyan168168(jolin)回复于 2005-04-02 09:48:48 得分 1
upTop
2 楼samkuang(执着前行)回复于 2005-04-02 10:15:39 得分 1
upTop
3 楼bluecocoqd(小骗骗)回复于 2005-04-02 11:46:12 得分 8
你的目的最终是对A和B中id相同,且pay=n的记录插入要B表中
create table B2 as select id from B;
truncate table B;
insert into B(id,name,area) (select A.id,A.name,A.area from A,B2 where B2.id= A.id
and a.pay = n)
Top
4 楼bluecocoqd(小骗骗)回复于 2005-04-02 11:46:48 得分 0
应该这3个操作就能达到你所要的目的Top
5 楼demonwinwin(节日快乐)回复于 2005-04-02 23:20:02 得分 0
谢谢 bluecocoqd(小骗骗)
不过
表A有上百万的数据每天要把符合一定条件的记录的一些字段值存入表B,
如果每天都truncate,会不会不太好啊,有碎片多?
还有,种种原因不需要用触发器
能不能有其他的方法呢?Top
6 楼kulama2004(kulama)回复于 2005-04-03 13:10:45 得分 28
用Merge
MERGE INTO table_b as B
USING ( select * from A where A.pay = 'n' ) as Temp
ON ( B.ID = Temp.ID )
WHEN MATCHED THEN
UPDATE B SET
B.name = Temp.name,
B.area = Temp.area
WHEN NOT MATCHED THEN
INSERT INTO B ( id, name, area )
VALUES ( Temp.id, Temp.name, Temp.area );Top
7 楼kulama2004(kulama)回复于 2005-04-03 13:12:45 得分 0
truncate B会带来问题的,因为B当中可能有与A中根本不匹配的ID存在,truncate之后会造成数据丢失
而且,无法rollbackTop
8 楼demonwinwin(节日快乐)回复于 2005-04-03 14:02:23 得分 0
谢谢:kulama2004(kulama)
“truncate B会带来问题的,因为B当中可能有与A中根本不匹配的ID存在,truncate之后会造成数据丢失
而且,无法rollback”
可能我没表述清楚
B中如果有与A中不匹配的ID存在,则应该在B中删除此ID。
truncate无法rollback
不过如果用delete 是不是太慢了呢?
Top
9 楼kulama2004(kulama)回复于 2005-04-03 17:05:54 得分 0
问题是。。你truncate之后,B就变成空表了
一条记录都没有,还怎么知道
--“如果B中有记录的id和要插入的数据id相同,则判断name、area是否一致”
你应该先把不同的纪录都删了,然后update所有id相同的纪录,使name、area一致
1.delete from B where B.id not in (select A.id from A where A.pay = n)
2.insert into B(id,name,area) (select A.id,A.name,A.area from A where A.id in ( select B2.id from B B2 ) and A.pay = n)Top
10 楼kulama2004(kulama)回复于 2005-04-03 17:12:38 得分 0
不好意思2写错
2.update B set
B.name = (select A.name from A where A.id = B.id and A.pay = n),
B.area = (select A.area from A where A.id = B.id and A.pay = n)
Top
11 楼kulama2004(kulama)回复于 2005-04-03 17:14:18 得分 0
还有一点你必须要保证id 在A表中是unique key或者primary keyTop
12 楼Engineer_develop(forest's sth)回复于 2005-04-03 18:46:24 得分 1
delete update insert 不提交的话回使用临时区域.上百万条数据可能会让你做不成.Top
13 楼Engineer_develop(forest's sth)回复于 2005-04-03 18:47:52 得分 1
建议考虑一下ROWID然后做个存储过程.Top
14 楼demonwinwin(节日快乐)回复于 2005-04-04 15:32:58 得分 0
谢谢大家
说的都不错Top
15 楼czrain(蝴蝶剑)回复于 2005-04-04 16:26:28 得分 0
truncate表不会产生碎片,delete才会产生!
truncate 表B
insert into 表B
select distinct id,name,area from 表A
where pay=n
我想你要实现的就是上面的操作吧!Top
16 楼demonwinwin(节日快乐)回复于 2005-04-05 09:11:45 得分 0
到底我结贴了没有啊
昨天结贴的时候出错
现在这个贴在我登陆的时候是打勾的,不过怎么看起来有和以前结过的贴不一样啊?
现在已经不能结贴了Top




