sql循环A表添加到B表的问题。

时间:2021-03-06 00:28:16
以前都是单个表操作,还可以自己解决,今天遇到的这个问题不得不求助论坛的前辈了。

实现的目的如下:用sqlserver代理做一个作业,每天按照A表的记录来生成B表的内容。

A表    有字段:aid
B表    根据A表里所有的记录来生成新纪录

比如A表里有10条记录,想写一个命令,让B表根据A表的内容生成10条新的记录,B表中也有个字段aid与B表对应。

请教一下怎么写这个语句那?

17 个解决方案

#1


select a.* , b.* from a , b where a.aid = b.aid

select top 10 a.* , b.* from a , b where a.aid = b.aid

#2


insert b select * from a where not exists(select 1 from a where a.aid=b.aid)

#3


你最好是:
最好给出完整的表结构,测试数据,计算方法和正确结果.


发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281

#4


应该不只是10条吧,只要把不重复的插入进去就完事了吧

#5


insert b select * from a where not exists(select 1 from a where a.aid=b.aid)

#6


declare @i int
set @i=1
while(@i<=10)   --A表的10条记录
begin
select top 1 aid from A where aid not in(select top (@i-1) aid form A)
--SQL 处理语句...
set @i=@i+1
end

#7


引用 6 楼 happycell188 的回复:
SQL code
declare @i int
set @i=1
while(@i<=10)   --A表的10条记录
begin
select top 1 aid from A where aid not in(select top (@i-1) aid form A)
--SQL 处理语句...
set @i=@i+1
end


这个是循环处理...

#8


楼上  如果记录不是10条  
而是根据A表的总条数来判断  
该怎么写?

#9


引用 8 楼 chyj521 的回复:
楼上 如果记录不是10条  
而是根据A表的总条数来判断  
该怎么写?
3楼.

#10


sql循环A表添加到B表的问题。
引用 5 楼 fredrickhu 的回复:
SQL code
insert b select * from a where not exists(select 1 from a where a.aid=b.aid)

#11


引用 8 楼 chyj521 的回复:
楼上 如果记录不是10条  
而是根据A表的总条数来判断  
该怎么写?
看看4L是不是你要的

#12


重新阐述一下

先列出数据库结构:
A表
[aid] [int] IDENTITY (1, 1) NOT NULL ,(广告的ID)
[downjin] [int] NULL ,(今天下载量)
[inall] [int] NULL ,(今天的点击量)

B表

[id] [int] IDENTITY (1, 1) NOT NULL ,(id无作用)
[days] [datetime] NULL ,(记录日期,如2010-4-20)
[aid] [int] NULL ,(与A表的aid相同)
[inall] [int] NULL ,(与A表的相同)
[downall] [int] NULL ,与A表的相同)



A表主要放广告的点击和下载量,只记录当天的。A中有多条记录,一条广告一个记录,无重复数据。
B表是记录所有日期的广告数据的,按日期来生成记录,即每过一天,B表就根据A表有多少条记录来生成新的记录,以日期区分是哪天的。

我想要做的是这样的:
做一个作业,每天0点执行一次,每次执行就把前一天A表中的数据导入到B表

但是代码不会写,很郁闷。
楼上所有的答案貌似都行不通。

#13


INSERT B表 
SELECT GETDATE(),AID,INALL,DOWNJIN 
FROM A表 A
WHERE NOT EXISTS(
    SELECT 1 FROM B WHERE A.AID=B.BID)
在A表没有时间字段的情况下,可以用此代码,放在作业中运行。建议A表新增一个时间字段,这样插入B表时就不用判断不包含已插入的记录,只需插入当天的记录即可。

#14


定时作业的制定  

企业管理器   
--管理   
--SQL Server代理   
--右键作业   
--新建作业   
--"常规"项中输入作业名称   
--"步骤"项   
--新建   
--"步骤名"中输入步骤名   
--"类型"中选择"Transact-SQL 脚本(TSQL)"   
--"数据库"选择执行命令的数据库   
--"命令"中输入要执行的语句:   
    EXEC 存储过程名 ...    

--确定   
--"调度"项   
--新建调度   
--"名称"中输入调度名称   
--"调度类型"中选择你的作业执行安排   
--如果选择"反复出现"   
--点"更改"来设置你的时间安排    


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行   

设置方法:   
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.  
定时作业的定制参考此方法

#15


--如果只考虑从A插入B
insert into b(days , aid , inall , downall) 
select convert(varchar(10),getdate(),120) , aid , inall ,downjin from a 

把上面的语句做成存储过程在下面的作业中去调用.
定时作业的制定

企业管理器 
--管理 
--SQL Server代理 
--右键作业 
--新建作业 
--"常规"项中输入作业名称 
--"步骤"项 
--新建 
--"步骤名"中输入步骤名 
--"类型"中选择"Transact-SQL 脚本(TSQL)" 
--"数据库"选择执行命令的数据库 
--"命令"中输入要执行的语句: 
                       EXEC 存储过程名 ... --该存储过程用于创建表 

--确定 
--"调度"项 
--新建调度 
--"名称"中输入调度名称 
--"调度类型"中选择你的作业执行安排 
--如果选择"反复出现" 
--点"更改"来设置你的时间安排  


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行 

设置方法: 
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定. 

#16


--如果只考虑从A插入B
insert into b(days , aid , inall , downall) 
select convert(varchar(10),getdate(),120) , aid , inall ,downjin from a 

--如果考虑数据可能存在重复。
insert into b(days , aid , inall , downall) 
select convert(varchar(10),getdate(),120) , aid , inall ,downjin from a 
where not exists 
(select 1 from b where days = convert(varchar(10),getdate(),120) and aid = a.aid)

#17


用楼上的方法解决了  
谢谢各位。

#1


select a.* , b.* from a , b where a.aid = b.aid

select top 10 a.* , b.* from a , b where a.aid = b.aid

#2


insert b select * from a where not exists(select 1 from a where a.aid=b.aid)

#3


你最好是:
最好给出完整的表结构,测试数据,计算方法和正确结果.


发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281

#4


应该不只是10条吧,只要把不重复的插入进去就完事了吧

#5


insert b select * from a where not exists(select 1 from a where a.aid=b.aid)

#6


declare @i int
set @i=1
while(@i<=10)   --A表的10条记录
begin
select top 1 aid from A where aid not in(select top (@i-1) aid form A)
--SQL 处理语句...
set @i=@i+1
end

#7


引用 6 楼 happycell188 的回复:
SQL code
declare @i int
set @i=1
while(@i<=10)   --A表的10条记录
begin
select top 1 aid from A where aid not in(select top (@i-1) aid form A)
--SQL 处理语句...
set @i=@i+1
end


这个是循环处理...

#8


楼上  如果记录不是10条  
而是根据A表的总条数来判断  
该怎么写?

#9


引用 8 楼 chyj521 的回复:
楼上 如果记录不是10条  
而是根据A表的总条数来判断  
该怎么写?
3楼.

#10


sql循环A表添加到B表的问题。
引用 5 楼 fredrickhu 的回复:
SQL code
insert b select * from a where not exists(select 1 from a where a.aid=b.aid)

#11


引用 8 楼 chyj521 的回复:
楼上 如果记录不是10条  
而是根据A表的总条数来判断  
该怎么写?
看看4L是不是你要的

#12


重新阐述一下

先列出数据库结构:
A表
[aid] [int] IDENTITY (1, 1) NOT NULL ,(广告的ID)
[downjin] [int] NULL ,(今天下载量)
[inall] [int] NULL ,(今天的点击量)

B表

[id] [int] IDENTITY (1, 1) NOT NULL ,(id无作用)
[days] [datetime] NULL ,(记录日期,如2010-4-20)
[aid] [int] NULL ,(与A表的aid相同)
[inall] [int] NULL ,(与A表的相同)
[downall] [int] NULL ,与A表的相同)



A表主要放广告的点击和下载量,只记录当天的。A中有多条记录,一条广告一个记录,无重复数据。
B表是记录所有日期的广告数据的,按日期来生成记录,即每过一天,B表就根据A表有多少条记录来生成新的记录,以日期区分是哪天的。

我想要做的是这样的:
做一个作业,每天0点执行一次,每次执行就把前一天A表中的数据导入到B表

但是代码不会写,很郁闷。
楼上所有的答案貌似都行不通。

#13


INSERT B表 
SELECT GETDATE(),AID,INALL,DOWNJIN 
FROM A表 A
WHERE NOT EXISTS(
    SELECT 1 FROM B WHERE A.AID=B.BID)
在A表没有时间字段的情况下,可以用此代码,放在作业中运行。建议A表新增一个时间字段,这样插入B表时就不用判断不包含已插入的记录,只需插入当天的记录即可。

#14


定时作业的制定  

企业管理器   
--管理   
--SQL Server代理   
--右键作业   
--新建作业   
--"常规"项中输入作业名称   
--"步骤"项   
--新建   
--"步骤名"中输入步骤名   
--"类型"中选择"Transact-SQL 脚本(TSQL)"   
--"数据库"选择执行命令的数据库   
--"命令"中输入要执行的语句:   
    EXEC 存储过程名 ...    

--确定   
--"调度"项   
--新建调度   
--"名称"中输入调度名称   
--"调度类型"中选择你的作业执行安排   
--如果选择"反复出现"   
--点"更改"来设置你的时间安排    


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行   

设置方法:   
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.  
定时作业的定制参考此方法

#15


--如果只考虑从A插入B
insert into b(days , aid , inall , downall) 
select convert(varchar(10),getdate(),120) , aid , inall ,downjin from a 

把上面的语句做成存储过程在下面的作业中去调用.
定时作业的制定

企业管理器 
--管理 
--SQL Server代理 
--右键作业 
--新建作业 
--"常规"项中输入作业名称 
--"步骤"项 
--新建 
--"步骤名"中输入步骤名 
--"类型"中选择"Transact-SQL 脚本(TSQL)" 
--"数据库"选择执行命令的数据库 
--"命令"中输入要执行的语句: 
                       EXEC 存储过程名 ... --该存储过程用于创建表 

--确定 
--"调度"项 
--新建调度 
--"名称"中输入调度名称 
--"调度类型"中选择你的作业执行安排 
--如果选择"反复出现" 
--点"更改"来设置你的时间安排  


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行 

设置方法: 
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定. 

#16


--如果只考虑从A插入B
insert into b(days , aid , inall , downall) 
select convert(varchar(10),getdate(),120) , aid , inall ,downjin from a 

--如果考虑数据可能存在重复。
insert into b(days , aid , inall , downall) 
select convert(varchar(10),getdate(),120) , aid , inall ,downjin from a 
where not exists 
(select 1 from b where days = convert(varchar(10),getdate(),120) and aid = a.aid)

#17


用楼上的方法解决了  
谢谢各位。