急急 求sql语句 无限级数据导入问题

一切为了你 2016-01-12 06:23:43
我现在数据库里有2个表 结构都是一模一样的,
表1 数据
现在要将 表2 数据
导入到表1中去 但是 topid parentid 都要按照表1 重新生成。 那样数据才是正确有效的, 请问sql 怎么写,
大家帮忙看看
...全文
235 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-01-13
  • 打赏
  • 举报
回复
再猜一个,通过生成上下级路径去更新
最后一段语句条件改改
;WITH T1
AS
(
SELECT *,[Path]=Name FROM 表1 WHERE parentID=0
UNION ALL
SELECT *,[Path]=b.[Path]+'-'+a.Name FROM 表1 AS a INNER JOIN T1 AS b ON b.ID=a.parentID
), T2
AS
(
SELECT *,[Path]=Name FROM 表2 WHERE parentID=0
UNION ALL
SELECT *,[Path]=b.[Path]+'-'+a.Name FROM 表2 AS a INNER JOIN T1 AS b ON b.ID=a.parentID
)
SELECT
a.*,b.ID AS ID2,b.parentID AS parentID2
INTO #
FROM T1 AS a
INNER JOIN T2 AS b ON b.[Path]=a.[Path]

UPDATE a
SET parentID2=ISNULL(b.ID2,0)
FROM # AS a
LEFT JOIN # AS b ON a.parentID=b.ID

UPDATE b SET topid=a.topid,parentID=a.parentID2 FROM # AS a INNER JOIN 表2 AS b ON b.ID=a.ID2
中国风 2016-01-13
  • 打赏
  • 举报
回复
引用 6 楼 skydemo 的回复:
name是可以重复,你这个方法不可行
要更新必须要有条件 那你通过什么逻辑去更新?你怎样才能判断需要更新?如果你需求都不清楚,怎么能帮你解决问题
一切为了你 2016-01-13
  • 打赏
  • 举报
回复
引用 5 楼 roy_88 的回复:
通过name去更新这样处理数据
SELECT 
	a.*,b.ID AS ID2,b.parentID AS parentID2
INTO #
FROM 表1 AS a 
	INNER JOIN 表2 AS b ON b.name=a.name

UPDATE a
SET parentID2=ISNULL(b.ID2,0)
FROM # AS a
	LEFT JOIN # AS b ON a.parentID=b.ID
	
UPDATE b SET topid=b.topid,parentID=b.parentID2 FROM # AS a INNER JOIN 表2 AS b ON a.name=b.name
name是可以重复,你这个方法不可行
中国风 2016-01-13
  • 打赏
  • 举报
回复
通过name去更新这样处理数据
SELECT 
	a.*,b.ID AS ID2,b.parentID AS parentID2
INTO #
FROM 表1 AS a 
	INNER JOIN 表2 AS b ON b.name=a.name

UPDATE a
SET parentID2=ISNULL(b.ID2,0)
FROM # AS a
	LEFT JOIN # AS b ON a.parentID=b.ID
	
UPDATE b SET topid=b.topid,parentID=b.parentID2 FROM # AS a INNER JOIN 表2 AS b ON a.name=b.name
中国风 2016-01-13
  • 打赏
  • 举报
回复
引用 3 楼 skydemo 的回复:
[quote=引用 1 楼 roy_88 的回复:] 是覆盖表1?你主要是想让ID从1开始吧 建 议把表1数据库清空 再把表2一层循环导入
表1的数据不能清空[/quote] 连个表的name是否完全一致,不会出现表1的NAME在表2不存在有没有?
一切为了你 2016-01-13
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
是覆盖表1?你主要是想让ID从1开始吧 建 议把表1数据库清空 再把表2一层循环导入
表1的数据不能清空
中国风 2016-01-13
  • 打赏
  • 举报
回复
当表达不清楚时就是举实际例子 比如:表1,表2,更新后表1后的显示数据 需求不明,大家只能给你提供方法参照
Ginnnnnnnn 2016-01-13
  • 打赏
  • 举报
回复
可以建一个临时表,使用Merge来记录表2的ID和插入表1的ID,插入数据之后根据这个关系更新它原有的关系,试下这样做。 写个伪代码参考
CREATE TABLE #Tmp
	(	[ID] INT,
		[NewID] INT
	)

MERGE tb1
USING tb2
ON 1 = 2
WHEN NOT MATCHED THEN INSERT (XXX) VALUES (XXX)
OUTPUT tb2.ID,Inserted.ID INTO #Tmp(ID,NewID);
一切为了你 2016-01-13
  • 打赏
  • 举报
回复
引用 7 楼 roy_88 的回复:
[quote=引用 6 楼 skydemo 的回复:] name是可以重复,你这个方法不可行
要更新必须要有条件 那你通过什么逻辑去更新?你怎样才能判断需要更新?如果你需求都不清楚,怎么能帮你解决问题[/quote] 需求就是 新表的数据插入到表1 中去 因为表1的pfid 代表每次插入的一批数据 这个值是需要变的,只需要管新插入的数据 按照表2中的层级关系 对应上就可以
中国风 2016-01-12
  • 打赏
  • 举报
回复
如果是覆盖表1 清空表1 再导入,
truncate table Table1;
go
insert into Table1
select * from Table2
或在SSMS里T1导入
中国风 2016-01-12
  • 打赏
  • 举报
回复
是覆盖表1?你主要是想让ID从1开始吧 建 议把表1数据库清空 再把表2一层循环导入

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧