【发布时间】:2016-02-09 04:06:34
【问题描述】:
问题: 我真的很难从一个以树形结构(父子结构)排列的部门表中选择一组特殊的部门。
您可以使用以下设置进行游戏: http://sqlfiddle.com/#!3/18a28/3
详情: 父子关系由名为 FullPath 的字符串属性建模。 FullPath-String 是由反斜杠分隔的数字顺序。例如:“1”是没有父系的部门。 '1\2' 是以部门 '1' 作为父部门的部门。 '1\3\5\6' 是一个以 '1\3\5' 作为父部门的部门,它本身具有 '1\3' 作为父部门,依此类推。每个部门记录都有一个名为 hasFKToOrg 的布尔属性,设置为 1 或 0。
这是设置: 创建表部门 ([FullPath] varchar(128), [hasFKToOrg] int) ;
INSERT INTO Department
([FullPath], [hasFKToOrg])
VALUES
('1', 1),
('1\2', 0),
('1\3', 1),
('1\3\6',0),
('1\3\4', 1),
('1\3\4\6', 0),
('1\3\5', 1),
('1\3\5\6', 0)
;
我需要什么: 一个选择语句,它提供一个专用父部门的所有子部门,包括父部门本身(根据定义,它总是用 hasFKToOrg = 1 标记)。必须从结果集中排除该父部门下也标记有 hasFKToOrg = 1 的所有子树分支。
例如:
- '1' 是父部门。 select 语句必须将“1”和“1/2”作为部门传递。
- '1\3' 是父部门。 select 语句必须将 '1\3' 和 '1\3\6' 作为部门传递。
- '1\3\4' 是父部门。 select 语句必须将 '1\3\4' 和 '1\3\4\6' 作为部门传递。
- '1\3\5' 是父部门。 select 语句必须将 '1\3\5' 和 '1\3\5\6' 作为部门传递。
到目前为止我的解决方案: 我尝试了部门之间的内部连接。由于多种原因,内部连接方法不起作用。我能做些什么呢?
DECLARE @root_path varchar(20) = '1\3';
GO
select d.FullPath, de.FullPath
from Department d
join Department de on (d.FullPath not like de.FullPath+'%')
where
d.FullPath like @root_path+'%'
and
(
de.hasFKToOrg = 1
and
de.FullPath <> @root_path
and
not (d.hasFKToOrg = 1 and de.hasFKToOrg = 1 and d.FullPath <> @root_path and de.FullPath <> @root_path)
)
这提供了 '1\3' 和 '1\3\4\6' 和 '1\3\5\6' 这是错误的,因为 '1\3' 和 '1\3\6' 是正确的部门。有什么建议我可以做些什么来获得正确的结果集?
【问题讨论】:
标签: sql sql-server tsql