如何映射(自动映射)同一表中的父子关系SQL server

如何映射(自动映射)同一表中的父子关系SQL server,sql,sql-server,Sql,Sql Server,我在数据库中有一个包含数据的SQL表 但现在需求已经改变了,我在表中引入了一个新的列ParentID 表结构 这是表的输出 在表中添加ParentID列后,我需要根据模块代码映射主id 以上查询输出 注意:数据已使用上述查询进行映射,但我注意到输出中存在异常,即 对于每个子模块,都有一个映射的父id,但如果是第三或第四级子模块,则存在冲突b/w父模块代码和子模块代码,最后子模块的父id不正确。请查找屏幕截图以更好地理解 这不是一个真正的解决方案,而是一个解释发生了什么的提示 右/反向子字符串有时

我在数据库中有一个包含数据的SQL表

但现在需求已经改变了,我在表中引入了一个新的列ParentID

表结构

这是表的输出

在表中添加ParentID列后,我需要根据模块代码映射主id

以上查询输出

注意:数据已使用上述查询进行映射,但我注意到输出中存在异常,即 对于每个子模块,都有一个映射的父id,但如果是第三或第四级子模块,则存在冲突b/w父模块代码和子模块代码,最后子模块的父id不正确。请查找屏幕截图以更好地理解


这不是一个真正的解决方案,而是一个解释发生了什么的提示

右/反向子字符串有时返回值,例如“.2”,但对于.1.3.4也是如此。。。等等

然后,带有该值的replace命令有时会出现双重匹配,例如与EW001.02.2.2匹配

然后保留错误的父代码,例如EW001.02而不是EW001.02.2

您可能会找到另一种方法来检索每个元素的良好父元素

编辑

因为它只是您需要匹配的层次结构的最后一级,所以您可以将后缀与替换一起使用,以获得正确的父代码:

REPLACE( [EopsModule].[ModuleCode] + '@', RIGHT( [EopsModule].[ModuleCode], CHARINDEX( '.', REVERSE( [EopsModule].[ModuleCode] ), 0 )) + '@', '' ) AS [ParentCode]

那么替换只会发生一次

不是真正的解决方案,而是解释发生了什么的提示

右/反向子字符串有时返回值,例如“.2”,但对于.1.3.4也是如此。。。等等

然后,带有该值的replace命令有时会出现双重匹配,例如与EW001.02.2.2匹配

然后保留错误的父代码,例如EW001.02而不是EW001.02.2

您可能会找到另一种方法来检索每个元素的良好父元素

编辑

因为它只是您需要匹配的层次结构的最后一级,所以您可以将后缀与替换一起使用,以获得正确的父代码:

REPLACE( [EopsModule].[ModuleCode] + '@', RIGHT( [EopsModule].[ModuleCode], CHARINDEX( '.', REVERSE( [EopsModule].[ModuleCode] ), 0 )) + '@', '' ) AS [ParentCode]

那么根据我的理解,替换只会发生一次

select p.id ParentId, p.ModuleCode ParentCode, c.ID, c.ModuleCode, c.Description 
from ##eopsmodule c 
left join ##eopsmodule p 
on c.modulecode like p.modulecode + '.' + '[1-9]' -- RE for only one digit. Not accept like '11', '24', '89'
输出为:

ParentId    ParentCode      ID  ModuleCode      Description 
NULL        NULL            1   EW001.00        Webshop standaard   
NULL        NULL            2   EW001.01        Algemene functionaliteit en configuratie
2           EW001.01        3   EW001.01.1      Single- of Multishop    
3           EW001.01.1      4   EW001.01.1.1    Optioneel: Multishop    
2           EW001.01        5   EW001.01.2      Taal    
5           EW001.01.2      6   EW001.01.2.1    Optioneel: Multi taal   
NULL        NULL            7   EW001.02        Design & Lay-out    
7           EW001.02        8   EW001.02.1      Standaard Lay-out wireframe / elementen 
7           EW001.02        9   EW001.02.2      Responsive / Mobile Friendly    
NULL        NULL            10  EW001.03        Content                             
10          EW001.03        11  EW001.03.1      Optioneel: Pagina artikelen (Website module)    
11          EW001.03.1      12  EW001.03.1.1    Optioneel: Content header & footer (Website module) 
10          EW001.03        13  EW001.03.2      Pagina Teksten  

据我了解,

select p.id ParentId, p.ModuleCode ParentCode, c.ID, c.ModuleCode, c.Description 
from ##eopsmodule c 
left join ##eopsmodule p 
on c.modulecode like p.modulecode + '.' + '[1-9]' -- RE for only one digit. Not accept like '11', '24', '89'
输出为:

ParentId    ParentCode      ID  ModuleCode      Description 
NULL        NULL            1   EW001.00        Webshop standaard   
NULL        NULL            2   EW001.01        Algemene functionaliteit en configuratie
2           EW001.01        3   EW001.01.1      Single- of Multishop    
3           EW001.01.1      4   EW001.01.1.1    Optioneel: Multishop    
2           EW001.01        5   EW001.01.2      Taal    
5           EW001.01.2      6   EW001.01.2.1    Optioneel: Multi taal   
NULL        NULL            7   EW001.02        Design & Lay-out    
7           EW001.02        8   EW001.02.1      Standaard Lay-out wireframe / elementen 
7           EW001.02        9   EW001.02.2      Responsive / Mobile Friendly    
NULL        NULL            10  EW001.03        Content                             
10          EW001.03        11  EW001.03.1      Optioneel: Pagina artikelen (Website module)    
11          EW001.03.1      12  EW001.03.1.1    Optioneel: Content header & footer (Website module) 
10          EW001.03        13  EW001.03.2      Pagina Teksten  

这对我有效,请更改您的查询,而不是

 REPLACE( [EopsModule].[ModuleCode], RIGHT( [EopsModule].[ModuleCode], CHARINDEX( '.', REVERSE( [EopsModule].[ModuleCode] ), 0 )), '' ) AS [ParentCode]
请尝试此操作,因为子字符串将在“.”之后返回准确的值

SUBSTRING( [EopsModule].[ModuleCode], 0, ( LEN( [EopsModule].[ModuleCode] ) 
- ( CHARINDEX( ''.'', REVERSE( [EopsModule].[ModuleCode] )) - 1 ))) 
AS [ParentCode]
输出:


这对我有效,请更改您的查询,而不是

 REPLACE( [EopsModule].[ModuleCode], RIGHT( [EopsModule].[ModuleCode], CHARINDEX( '.', REVERSE( [EopsModule].[ModuleCode] ), 0 )), '' ) AS [ParentCode]
请尝试此操作,因为子字符串将在“.”之后返回准确的值

SUBSTRING( [EopsModule].[ModuleCode], 0, ( LEN( [EopsModule].[ModuleCode] ) 
- ( CHARINDEX( ''.'', REVERSE( [EopsModule].[ModuleCode] )) - 1 ))) 
AS [ParentCode]
输出:


是的,它工作很好,但在我的数据库中,我有11,22,33,在这种情况下,它不工作,但感谢显示另一种方式:。是的,它工作很好,但在我的数据库中,我有11,22,33,在这种情况下,它不工作,但感谢显示另一种方式:。谢谢,伙计,但它仍然有异常,错误的家长id。谢谢,lot现在工作正常,但一些数据未反映,未根据ParentCode映射ParentID:Thank mate,但它仍然存在错误父id的异常。谢谢,lot现在工作正常,但一些数据未反映,未根据ParentCode映射ParentID: