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