Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >给定父/子密钥表,我们如何递归地将结构副本插入到另一个表中?

给定父/子密钥表,我们如何递归地将结构副本插入到另一个表中?
EN

Stack Overflow用户
提问于 2016-04-26 10:09:41
回答 2查看 1.1K关注 0票数 1

我有一个递归的CTE,它给出了一组父级子键的列表,如下所示,让我们在一个名为#relationtree的临时表中这样说

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Parent | Child
--------------
1      | 3
3      | 5
5      | 6
5      | 9

我想要创建这些关系的副本到一个表中,比如说,下面的结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE [dbo].[Relations]
(
  [Id] int identity(1,1)
  [ParentId] int
)

我如何插入上述记录,但递归地获得先前插入的标识值,以便能够将该值作为我插入的每个子副本的ParentId列插入?

在dbo.Relations中,我希望在此结束时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Id | ParentId
-------------
... other rows present before this query ...
50 | NULL
51 | 50
52 | 51
53 | 51

我不确定scope_identity是否能够在这种情况下工作,或者是否使用新is列表创建新的临时表并手动插入标识列是正确的方法?

我可以编写一个游标/循环来完成这个任务,但是必须有一种很好的方法来执行递归选择魔术!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-26 10:33:09

由于您试图将树放入表的一个段中,所以看起来无论如何您都需要对表使用SET IDENTITY_INSERT ON。你需要确保这棵新树有空间。在本例中,我将假设49是表中当前的最大id,这样我们就不需要担心超出表后面的树了。

您需要能够将ID从旧树映射到新树。除非‘d有一些规则,精确的映射应该是不相关的,只要它是准确的,所以在这种情况下,我只需要这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET IDENTITY_INSERT dbo.Relations ON

;WITH CTE_MappedIDs AS
(
    SELECT
        old_id,
        ROW_NUMBER() OVER(ORDER BY old_id) + 49 AS new_id
    FROM
    (
        SELECT DISTINCT parent AS old_id FROM #relationtree
        UNION
        SELECT DISTINCT child AS old_id FROM #relationtree
    ) SQ
)
INSERT INTO dbo.Relations (Id, ParentId)
SELECT
    CID.new_id,
    PID.new_id
FROM
    #relationtree RT
INNER JOIN CTE_MappedIDs PID ON PID.old_id = RT.parent
INNER JOIN CTE_MappedIDs CID ON CID.old_id = RT.parent
-- We need to also add the root node
UNION ALL
SELECT
    NID.new_id,
    NULL
FROM
    #relationtree RT2
INNER JOIN CTE_MappedIDs NID ON NID.old_id = RT2.parent
WHERE
    RT2.parent NOT IN (SELECT DISTINCT child FROM #relationtree)

SET IDENTITY_INSERT dbo.Relations OFF

我还没有测试过它,但是如果它不能像预期的那样工作,那么希望它能为您指明正确的方向。

票数 1
EN

Stack Overflow用户

发布于 2016-04-26 11:42:56

我知道您已经有了一个可行的答案,但我认为您可以使用延迟函数来检查上一行,前提是您有Server 2012或更高版本,您可以更简单地完成相同的任务(而不是Tom H的答案有任何问题)。

设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE #relationtree (
    Parent INT,
    Child INT
)

CREATE TABLE #relations (
    Id INT IDENTITY(1,1),
    ParentId INT
)

INSERT INTO #relationtree (Parent, Child) VALUES(1,3), (3,5), (5,6), (5,9)

INSERT INTO #relations (ParentId) values(1), (3), (5)

解决方案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE @offset INT = IDENT_CURRENT('#relations')

;WITH relationtreeids AS (
    SELECT *,
           ROW_NUMBER() OVER(ORDER BY Parent, Child) - 2 AS UnmodifiedParentId -- Simulate an identity field
    FROM #relationtree
)
INSERT INTO #relations
-- The LAG window function allows you to inspect the previous row
SELECT  CASE WHEN LAG(Parent) OVER(ORDER BY Parent) IS NULL 
                THEN NULL
             WHEN LAG(Parent) OVER(ORDER BY Parent) = Parent 
                THEN UnmodifiedParentId + @offset ELSE UnmodifiedParentId + @offset + 1 
        END AS ParentId
FROM relationtreeids

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Id  ParentId
1   1
2   3
3   5
4   NULL
5   4
6   5
7   5
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36872623

复制
相关文章
访问令牌JWT
By reference token(透明令牌),随机生成的字符串标识符,无法简单猜测授权服务器如何颁 发和存储资源服务器必须通过后端渠道,发送回OAuth2授权服务器的令牌检查端点,才能校验令牌 是否有效,并获取claims/scopes等额外信息
乐心湖
2020/08/02
1.7K0
Docker镜像详谈(3): 镜像内容存放在哪里?
据说重要的事情要说三遍,那我再表述一下个人观点:Docker 镜像是 Docker 的灵魂所在。
Henry Zhang
2019/04/12
8.6K0
Docker镜像详谈(3): 镜像内容存放在哪里?
2019年CIO应该把钱花在哪里?这个调查告诉你
新的一年,许多CIO都在考虑把预算放在哪个方向,对哪些领域的预算增加一些,对哪些领域的投资减少一些。
人称T客
2019/05/08
4870
2019年CIO应该把钱花在哪里?这个调查告诉你
这家人工智能公司告诉你应该把钱投向哪里
在2000年代中期的某个时候,对冲基金所有者想出了一个点子。金融市场是受新闻影响的—所以如果你能彻底地理解新闻,而且能非常迅速,那你就能抢在市场变化前面。利用人工智能技术,他们设计了一种软件,能实时分析爆炸性新闻,评估新闻的意义,并且能在数秒内根据上述分析进行交易。 就像在对冲基金领域的很多事情一样,这种人工智能技术仍然只是亿万富豪和专业投资者的专属。但是Amareos,一家香港创业企业,正想法设法将这项技术带给普通的投资人。 测量世界的温度 “我们尽力将大数据技术民主化,”Philippe EI-As
点滴科技资讯
2018/04/28
2.7K0
这家人工智能公司告诉你应该把钱投向哪里
XXL-JOB访问令牌(AccessToken)设置
为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;
Li_XiaoJin
2022/12/28
20.8K0
XXL-JOB访问令牌(AccessToken)设置
访问令牌过期后,如何自动续期?
JWT是JSON Web Token的缩写,是为了在网络应用环境间传递声明而执行的- -种基于JSON的开放标准((RFC 7519)。JWT本身没有定义任何技术实现,它只是定义了一种基于Token的会话管理的规则,涵盖Token需要包含的标准内容和Token的生成过程,特别适用于分布式站点的单点登录(SSO) 场景。
Tinywan
2023/03/08
2.6K0
访问令牌过期后,如何自动续期?
C/C++ 实现提升访问令牌权限
在我们编程实现一些系统操作的时候,往往要求我们执行操作的进程拥有足够的权限方可成功操作。比如,我们使用 ExitWindows 函数实现关机或重启操作的时候,就要求我们的进程要有 SE_SHUTDOWN_NAME 的权限,否则,会忽视不执行操作。这时,我们唯一能够做的,就是按照要求,提升我们进程的权限。
微软技术分享
2022/12/28
7900
怎样把DataGrid存放在ViewState中的无用数据卡掉
作者:无间道的博客http://www.cnblogs.com/wangsaokui/article网络
Java架构师必看
2021/03/22
5150
JWT应该保存在哪里?
最近几年的项目我都用JWT作为身份验证令牌。我一直有一个疑问:服务端发放给浏览器的JWT到底应该存储在哪里?这里只讨论浏览器的场景,在这个场景里有三种选择。
码农小胖哥
2021/10/19
2.2K0
Apache APISIX 默认访问令牌漏洞 (CVE-2020-13945)
百度:API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中间的路由被称之为网关。
网e渗透安全部
2022/06/15
2.9K0
Apache APISIX 默认访问令牌漏洞 (CVE-2020-13945)
Groovy 我的Class在哪里
通过将getLocation方法添加到Class类,Groovy 2.5.0可以获得Class文件的位置。 如果Class是JDK的一部分,则返回的位置是null,否则是我们使用Class文件获取JAR文件或源文件(如果可用)的位置。
白石
2019/08/23
6180
springcloud中feign的@FeignClient应该写在哪里?
最近项目组拿了友商的springcloud alibaba项目来进行改造,在翻阅他们的代码时候,发现他们把@FeignClient写在服务提供方的API上,他们这样的写法成功的引起我的注意,于是抱着好学的心态请教友商的开发人员,于是一篇水文就这么诞生了
lyb-geek
2020/11/28
2.2K0
springcloud中feign的@FeignClient应该写在哪里?
计算机网络:随机访问介质访问控制之令牌传递协议
在轮询访问中,用户不能随机地发送信息,而要通过一个集中控制的监控站,以循环方式轮询每个结点,再决定信道的分配。当某结点使用信道时,其他结点都不能使用信道。典型的轮询访问介质访问控制协议是令牌传递协议,它主要用在令牌环局域网中。
timerring
2022/11/18
1K0
我能力的边界在哪里?
导读:能力的边界绝不是自己一出道就给自己画的圆,而是在实践中通过不断地挑战未知探索出来的。那么,这个边界就不可能是个光滑的界线,更像是一个个触角延伸在四方,不断地吸取养分,从而作用于自己的核心能力之上。
用户1756920
2018/07/23
6620
我能力的边界在哪里?
请问怎么把我的一个长网址设置到域名访问?
比如:我的网站是https://www.bw3785.com/pjie 我注册了腾讯的bw5188.com 我希望以后别人输入bw5188.com就可以访问我的第一个长网址,该如何实现? 这个问题很头疼,在域名解析里面找了半天没找到呢 比如:我的网站是https://www.bw3785.com/pjie 我注册了腾讯的bw5188.com 我希望以后别人输入bw5188.com就可以访问我的第一个长网址,该如何实现? 这个问题很头疼,在域名解析里面找了半天没找到呢
用户6354929
2019/10/02
3.7K0
Python 分析天气,告诉你中秋应该去哪里
中秋佳节将近,不知道各位小伙伴儿有没有想好去哪里玩呢。不过说实在的,每到节假日,到处都是人山人海,那句“我动也不能动”,还不时的出现在我的耳畔呢。
1480
2019/09/10
4320
Python 分析天气,告诉你中秋应该去哪里
Python 分析天气,告诉你中秋应该去哪里
中秋佳节将近,不知道各位小伙伴儿有没有想好去哪里玩呢。不过说实在的,每到节假日,到处都是人山人海,那句“我动也不能动”,还不时的出现在我的耳畔呢。
周萝卜
2020/05/22
3770
授权服务是如何颁发授权码和访问令牌的?
授权服务如何生成访问令牌? 访问令牌过期了而用户又不在场的情况下,又如何重新生成访问令牌?
JavaEdge
2021/02/23
2.8K0
授权服务是如何颁发授权码和访问令牌的?
我靠(call) ,我的未来(Future)在哪里???
大家好,我是 cxuan,之前一直在分享操作系统相关的文章,兜兜转转回到了 Java 文章分享,本篇文章是读者投稿,来和你一起聊一聊 Future ~
cxuan
2020/08/02
5290
我说我不会算法,阿里把我挂了。[通俗易懂]
工作已经有一段时间了,有的时候会跟同事们打趣:“如果你让我现在去手写一个快速排序,我怕是真的写不出来”。
全栈程序员站长
2022/08/30
2830
我说我不会算法,阿里把我挂了。[通俗易懂]

相似问题

mapbox访问令牌-我应该把它放在哪里?

10

我应该把许可证文件存放在哪里?

22

我应该把用户上传的照片存放在哪里?

11

我的Git个人访问令牌存放在哪里?

156

API访问令牌存放在哪里?

131
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文