关于表数据复制的问题

SUMI_SUMI 2017-11-21 02:44:05
请教大家一个问题:

我的数据中中有2个表,tableA,tableB
其中表tableA中有字段 A,B,C,D,E
tableB中有字段B,C,D
我想把tableA中的BCD字段插入到tableB的BCD中,
并且满足 如果tableA中BCD完全相同条目不重复插入到tableB,且tableA的B为null的不插入到tableB
如何写sql语句?
...全文
303 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
吉普赛的歌 2017-11-23
下面的 row_number 这一列是正确无误的了:
drop table if exists testTable1;
create table testTable1( id INT PRIMARY KEY,[name] NVARCHAR(20), parentId INT );
INSERT INTO testTable1(id,[name],parentId) VALUES(2,'xf1',0);
INSERT INTO testTable1(id,[name],parentId) VALUES(3,'xf2',0);
INSERT INTO testTable1(id,[name],parentId) VALUES(5,'xf3',2);
INSERT INTO testTable1(id,[name],parentId) VALUES(6,'xf4',3);
INSERT INTO testTable1(id,[name],parentId) VALUES(7,'xf5',4);
INSERT INTO testTable1(id,[name],parentId) VALUES(9,'xf6',5);

delete from testTable1 where id=7;

select 
  rowid
  ,(select count(*) from testTable1 b  where a.id >= b.id) as row_number
  ,* 
from testTable1 as a 
order by id;
/*
rowid	row_number	id	name	parentId
1	        1	    2	xf1	    0
2	        2	    3	xf2	    0
3	        3	    5	xf3	    2
4	        4	    6	xf4	    3
6	        5	    9	xf6	    5
*/
  • 打赏
  • 举报
回复
SUMI_SUMI 2017-11-22
引用 13 楼 yenange 的回复:
用 rowid 就是了。
感谢,但是rowid好像是曾经存在过的id 如果我之前删除或者操作过数据, 貌似update frmt set D=rowid 也不是1234567递增的 而是1235678这样也有缺失 rowid应该是真实行号而不是当前(查询结果)行号,所以如果数据是未经改动的才可以这么干......
  • 打赏
  • 举报
回复
吉普赛的歌 2017-11-22
create table if not exists testTable1( id INT PRIMARY KEY,[name] NVARCHAR(20), parentId INT );
INSERT INTO testTable1(id,[name],parentId) VALUES(2,'xf1',0);
INSERT INTO testTable1(id,[name],parentId) VALUES(3,'xf2',0);
INSERT INTO testTable1(id,[name],parentId) VALUES(5,'xf3',2);
INSERT INTO testTable1(id,[name],parentId) VALUES(6,'xf4',3);
INSERT INTO testTable1(id,[name],parentId) VALUES(7,'xf5',4);
INSERT INTO testTable1(id,[name],parentId) VALUES(9,'xf6',5);

select rowid as RowNumber ,* from testTable1 order by id




用 rowid 就是了。
  • 打赏
  • 举报
回复
SUMI_SUMI 2017-11-21
引用 11 楼 yenange 的回复:
你到底用的是 SQL Server 还是 Sqlite ? 还有用的是什么版本?
Sqlite 3
  • 打赏
  • 举报
回复
吉普赛的歌 2017-11-21
你到底用的是 SQL Server 还是 Sqlite ? 还有用的是什么版本?
  • 打赏
  • 举报
回复
SUMI_SUMI 2017-11-21
引用 9 楼 yenange 的回复:
不要在乎 id 是否在错误情况下自增, 这个东西在业务上本身就不重要,也不方便控制。 如果业务上确实需要有一个按“顺序”的代号,那你可以再加一个字段。
请问具体如何处理? 我确实需要在tableB里面有个字段内容是从1开始递增的,所以我才加了个字段D并且设为自增
  • 打赏
  • 举报
回复
吉普赛的歌 2017-11-21
不要在乎 id 是否在错误情况下自增, 这个东西在业务上本身就不重要,也不方便控制。 如果业务上确实需要有一个按“顺序”的代号,那你可以再加一个字段。
  • 打赏
  • 举报
回复
SUMI_SUMI 2017-11-21
引用 7 楼 SUMI_SUMI 的回复:
b is not null改成length(b)>0 条件就OK了 但是还是会插入重复数据 这个怎么解决?
我用代码如下 insert OR IGNORE into tableA (a,b,c ) SELECT a, b,c FROM tableB WHERE length(c) > 0 在表里面进行了约束实现了不插入重复数据,但是因为我的tableB中有一个字段D(是int的主键自增) 我摄像的是插入从1开始一次递增 结果我发现插入后的实际数据的D不是从1开始的 因该是因为插入的时候虽然IGNORE起了作用D还是自增了 这个如何解决呢?
  • 打赏
  • 举报
回复
SUMI_SUMI 2017-11-21
b is not null改成length(b)>0 条件就OK了 但是还是会插入重复数据 这个怎么解决?
  • 打赏
  • 举报
回复
SUMI_SUMI 2017-11-21
感谢楼上各位
引用 5 楼 leo_lesley 的回复:
[quote=引用 3 楼 SUMI_SUMI 的回复:] [quote=引用 1 楼 leo_lesley 的回复:] insert tableB select distinct B,C,D from tableA where b is not null
额 我用的SQLiteExpertPro操作的sqlite 结果报错:near "tableB":syntax error[/quote] --加上into,试试看 insert into tableB(B,C,D) select distinct B,C,D from tableA where b is not null [/quote] 是的 这样可行 但是tableB中插入的数据,重复和和为null的都进去了
  • 打赏
  • 举报
回复
leo_lesley 2017-11-21
引用 3 楼 SUMI_SUMI 的回复:
[quote=引用 1 楼 leo_lesley 的回复:] insert tableB select distinct B,C,D from tableA where b is not null
额 我用的SQLiteExpertPro操作的sqlite 结果报错:near "tableB":syntax error[/quote] --加上into,试试看 insert into tableB(B,C,D) select distinct B,C,D from tableA where b is not null
  • 打赏
  • 举报
回复
听雨停了 2017-11-21

use Tempdb
go
--> --> 听雨停了-->测试数据
 
if not object_id(N'Tempdb..#tabA') is null
	drop table #tabA
Go
Create table #tabA([A] int,[B] int,[C] int,[D] int,[E] int)
Insert #tabA
select 1,2,3,4,5 union all
select 8,2,3,4,5 union all
select 1,1,1,1,1 union all
select 1,null,1,2,3

if not object_id(N'Tempdb..#tabB') is null
	drop table #tabB
Go
Create table #tabB([B] int,[C] int,[D] int)
Insert #tabB
select 1,1,1
--测试数据结束


--1.除去BCD重复且B不等于null的数据,插入到#tabC中
SELECT DISTINCT B,C,D 
INTO #tabC
FROM #tabA
WHERE ISNULL(B,'')<>''

--2.使用merge函数进行数据同步
MERGE INTO #tabB AS T
USING #tabC AS S
ON t.B=s.B AND t.C=s.C AND t.D=s.D
WHEN NOT matched	--目标表(#tabB)中没有时,源表(#tabC)数据插入
THEN INSERT values(s.B,s.C,s.D);

SELECT * FROM #tabB

B           C           D
----------- ----------- -----------
1           1           1
2           3           4
  • 打赏
  • 举报
回复
SUMI_SUMI 2017-11-21
引用 1 楼 leo_lesley 的回复:
insert tableB select distinct B,C,D from tableA where b is not null
额 我用的SQLiteExpertPro操作的sqlite 结果报错:near "tableB":syntax error
  • 打赏
  • 举报
回复
二月十六 2017-11-21
--测试数据
if not object_id(N'Tempdb..#tableA') is null
drop table #tableA
Go
Create table #tableA([A] int,[B] int,[C] int,[D] int,[E] int)
Insert #tableA
select 1,1,1,1,1 union ALL
select 1,1,1,1,1 union all
select 2,NULL,2,2,2 union all
select 3,3,3,3,3
GO
if not object_id(N'Tempdb..#tableB') is null
drop table #tableB
Go
Create table #tableB([B] int,[C] int,[D] int)
Insert #tableB
select 1,2,3
Go
--测试数据结束
INSERT INTO #tableB
( B, C, D )
SELECT DISTINCT
B ,
C ,
D
FROM #tableA
WHERE B IS NOT NULL

SELECT * FROM #tableB


  • 打赏
  • 举报
回复
leo_lesley 2017-11-21
insert tableB select distinct B,C,D from tableA where b is not null
  • 打赏
  • 举报
回复
相关推荐
发帖
应用实例
加入

2.7w+

社区成员

MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
申请成为版主
帖子事件
创建了帖子
2017-11-21 02:44
社区公告
暂无公告