读书人

关于主从表中插入记录的有关问题

发布时间: 2013-09-06 10:17:17 作者: rapoo

关于主从表中插入记录的问题
我现在 有 a ,b,c 3个表 ,b和c是主从表

a 里面 有 id ,name ,code
b里面有 guid,name,code
c 里面 有 guid, bid, name,code

现在 我要把 a 里面记录插入 到b 里面 再插入 到c里面去

a 里面有 如下几条记录
1 张三 001
2 李四 002
3 王五 003
4 赵六 004

那 b里面应该是
1 张三 001
2 李四 002
3 王五 003
4 赵六 004
c 里面 会是
1 1 李四 002
2 1 王五 003
3 1 赵六 004
4 2 张三 001
5 2 王五 003
6 2 赵六 004
7 3 张三 001
8 3 李四 002
9 3 赵六 004
10 4 张三 001
11 4 李四 002
12 4 王五 003

求 存储过程 。



主从 存储
[解决办法]


create table a
(id int, name varchar(10), code varchar(10))

create table b
(guid int, name varchar(10), code varchar(10))

create table c
(guid int, bid int, name varchar(10), code varchar(10))

insert into a
select 1,'张三','001' union all
select 2,'李四','002' union all
select 3,'王五','003' union all
select 4,'赵六','004'


-- 插入b表
insert into b(guid,name,code)


select id,name,code from a

-- 插入c表
insert into c(guid,bid,name,code)
select row_number() over(order by getdate()) 'rn',
y.id,x.name,x.code
from a x
cross join a y
where x.id<>y.id


-- 结果
select * from b
/*
guid name code
----------- ---------- ----------
1 张三 001
2 李四 002
3 王五 003
4 赵六 004

(4 row(s) affected)
*/

select * from c
/*
guid bid name code
----------- ----------- ---------- ----------
1 1 李四 002
2 1 王五 003
3 1 赵六 004
4 2 张三 001
5 2 王五 003
6 2 赵六 004
7 3 张三 001
8 3 李四 002


9 3 赵六 004
10 4 张三 001
11 4 李四 002
12 4 王五 003

(12 row(s) affected)
*/


[解决办法]
INSERT INTO b([guid], name, code)
SELECT
ROW_NUMBER() OVER(ORDER BY a.id),
a.NAME,
a.code
FROM a
WHERE NOT EXISTS
(
SELECT 1
FROM b
WHERE b.NAME = a.NAME
AND b.code = a.code
)

INSERT INTO dbo.c([guid], bid, name, code)
SELECT
ROW_NUMBER() OVER(ORDER BY m.[guid]),
m.[guid],
n.NAME,
n.code
FROM dbo.b m
INNER JOIN dbo.b n
ON m.NAME<>n.NAME
AND m.code <> n.code

[解决办法]
create table A(id int,name varchar(10),code varchar(10))
create table B([guid] int,name varchar(10),code varchar(10))
create table C([guid] int identity(1,1),bid int,name varchar(10),code varchar(10))
insert into A
select 1,'张三','001'
union all select 2,'李四','002'
union all select 3,'王五','003'
union all select 4,'赵六','004'

insert into B
select 1,'张三','001'
union all select 2,'李四','002'
union all select 3,'王五','003'
union all select 4,'赵六','004'

create proc proc_test
as
set nocount on
declare @id int,@maxid int
declare @i int
set @i=1
declare cur cursor for select id from a
open cur
fetch next from cur into @id

while @@fetch_status = 0
begin
insert into c(bid,name,code)
select @i,name,code
from b


where [guid]<>@id
fetch next from cur into @id
set @i=@i+1
end
close cur
deallocate cur

go

exec proc_test
/*
drop proc proc_test
drop table A,B,C
*/

select * from C

/*
guidbidnamecode
11李四002
21王五003
31赵六004
42张三001
52王五003
62赵六004
73张三001
83李四002
93赵六004
104张三001
114李四002
124王五003
*/


[解决办法]
所谓存储过程,也就是组织好的SQL组合吧
先想好三个SQL,再弄到一起

读书人网 >SQL Server

热点推荐