Questions tagged «hierarchy»

有关将项目安排到有序级别的问题。

3
查找层次结构字段的最高级别:带有CTE或不带有CTE
注意:此问题已更新,以反映出我们当前正在使用MySQL,这样做之后,我想知道如果切换到支持CTE的数据库会容易得多。 我有一个带有主键id和外键的自引用表parent_id。 +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | parent_id | int(11) | YES | | NULL | | | name | varchar(255) | YES | | NULL …

3
父子树层次结构订单
我必须遵循SQL Server 2008 R2中的数据。SQLFiddle 架构: 创建表[dbo]。[ICFilters]( [ICFilterID] [int] IDENTITY(1,1)NOT NULL, [ParentID] [int] NOT NULL默认值0, [FilterDesc] [varchar](50)NOT NULL, [Active] [tinyint] NOT NULL默认值1, 约束[PK_ICFilters]主键 ([ICFilterID] ASC)与 PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS =开启 )在[PRIMARY]上 )在[PRIMARY]上 插入[dbo]。[ICFilters](ParentID,FilterDesc,活动) 价值观 (0,“产品类型”,1), (1,'ProdSubType_1',1), (1,'ProdSubType_2',1), (1,'ProdSubType_3',1), (1,'ProdSubType_4',1), (2,'PST_1.1',1), (2,'PST_1.2',1), (2,'PST_1.3',1), …

5
有人在生产中使用HierarchyId吗?它可靠吗?
是否有人在实际生产中使用HierarchyId,并且表的大小合理,有几千行?它可靠/性能好吗?到目前为止,我还没有发现任何与该供应商无关的人推荐它,Paul Nielsen 在此建议不要这样做。 您在实际生产系统中使用HierarchyId有什么经验? 在选择HierarchyId替代方案时使用了哪些条件?

3
创建多级层次结构,其中每个节点具有随机数量的子级
我需要创建一些涉及层次结构的测试数据。我可以简化并做几个CROSS JOINs,但这将使我的结构完全统一/没有任何变化。这不仅看起来很乏味,而且测试数据的缺乏变化有时掩盖了原本会发现的问题。因此,我想生成遵循以下规则的非统一层次结构: 3级深 1级随机是5-20个节点 级别2是1-10个节点,级别1的每个节点随机 级别3是1-5个节点,级别2的每个节点随机 所有分支的深度将为3级。此时,深度均匀是可以的。 在任何给定级别上,子节点的名称都可以重叠(即,子节点的名称在同一级别的所有节点上不必唯一)。 术语“随机”在此定义为伪随机,而不是唯一随机的。需要提到这一点,因为术语“随机”通常用于表示“不会产生重复项的给定集合的随机排序”。我接受random = random,如果第1级每个节点的子代数分别只有4、7和8,即使跨越第1级20个节点,每个节点的潜在散布为1-10个子代,那很好,因为那是随机的。 即使使用嵌套WHILE循环可以很容易地做到这一点,但首选还是要找到一种基于集合的方法。一般而言,生成测试数据并没有生产代码所具有的效率要求,但是针对基于集合的方法进行射击可能会更具教育意义,并且在将来找到基于集合的问题解决方法时会有所帮助。因此,WHILE循环不排除循环,只有在不可能使用基于集合的方法时才可以使用循环。 基于集合=理想情况下是单个查询,而不考虑CTE,APPLY等。因此,使用现有或内联数字表就可以了。使用WHILE / CURSOR /过程方法将不起作用。我想将数据的部分存储到临时表或表变量中就好了,只要这些操作都是基于集合的,没有循环即可。但是,话虽如此,除非可以证明多查询方法实际上更好,否则单查询方法可能比多查询更受青睐。还请记住,“更好”的构成通常是主观的;-)。还请记住,前一句中“通常”的使用也是主观的。 任何版本的SQL Server(我想是2005年及更高版本)都可以。 只有纯T-SQL:没有这些愚蠢的SQLCLR东西!至少在生成数据方面。创建目录和文件将使用SQLCLR完成。但是在这里,我只是专注于生成所创建内容的价值。 T-SQL多语句TVF被认为是过程性的,而不是基于集合的,即使在外部它们掩盖了集合中的过程方法。有时候这是绝对合适的。这不是那个时候之一。同样,也不允许使用T-SQL标量函数,这不仅是因为它们也是过程性的,而且查询优化器有时会缓存其值并重复该值,以使输出结果与预期不符。 T-SQL内联TVF(又名iTVF)是基于集合的okey-dokey,并且实际上与使用相同[ CROSS | OUTER ] APPLY,后者如上所述是可以的。 重复执行查询应产生与先前运行几乎不同的结果。 更新说明1:最终结果集应表示为Level3的每个不同节点都有一行,其完整路径从Level1开始。这意味着Level1和Level2值将必须在一个或多个行上重复,除非只有一个Level2节点仅包含一个Level3节点。 澄清更新2:每个节点都有一个非常好的首选项,每个节点都有一个名称或标签,而不仅仅是一个数字。这将使生成的测试数据更加有意义和现实。 我不确定这个附加信息是否重要,但是如果万一有助于了解某些情况,测试数据将与我对以下问题的回答有关: 将XML文件导入SQL Server 2012 尽管此时不相关,但是生成此层次结构的最终目标是创建一个目录结构来测试递归文件系统方法。级别1和2将是目录,级别3将最终成为文件名。我搜索了一下(在这里和通过Google),但只发现了一个参考,以生成随机层次结构: Linux:创建随机目录/文件层次结构 这个问题(在StackOverflow上)实际上在期望结果方面非常接近,因为它还试图创建用于测试的目录结构。但是,这个问题(以及答案)的重点是Linux / Unix shell脚本,而不是我们所生活的基于集合的世界。 现在,我知道了如何生成随机数据,并且已经在创建文件的内容,以便它们也可以显示变化。这里最棘手的部分是每个集合中元素的数量是随机的,而不是特定的字段。并且,每个节点内的元素数量必须与同一级别上的其他节点随机。 示例层次结构 Level 1 Level 3 |---- A | |-- 1 …

4
使用SQL在关系数据库中遍历树状数据
有没有一种方法可以遍历SQL中的树数据?我connect by在Oracle中了解,但是在其他SQL实现中还有另一种方法吗?我问是因为使用connect by它比编写循环或递归函数来为每个结果运行查询要容易。 由于某些人似乎对短语“树数据”感到困惑,因此我将进一步解释:我的意思是关于具有parent_id或类似字段的表,其中包含相同表中另一行的主键。 问题来自一个经验,当时我正在以这种方式存储在Oracle数据库中的数据,并且知道connect by在其他DBMS中未实现。如果要使用标准SQL,则必须为每个要使用的父级创建一个新的表别名。这很容易失控。

2
有没有一种基于集合的方式来加载/读取带有HierarchyId的树枝
我正在玩HierarchyId,但还没有想出一种基于集合的方法来执行以下操作: 一次插入所有子树 一次检索所有子树 这个问题与我的上一个问题有关,我怀疑用HierarchyId完成这两项任务的唯一方法是一次一个节点或一个级别。如果我使用的是物化路径,则可以通过一个(且不重要的)基于集合的命令轻松地完成这两个动作。 我想念什么? 编辑:我也错过了一种移动子树的方法,但我从Mikael Eriksson的评论中学到了

3
Oracle:如何查询层次表?
背景 这是为了构造一些我们将用于报告的视图。 我有一张位置表,关键字段是“ location”和“ parent”。 这两个字段在层次上创建的结构与公司名称->校园名称->建筑物名称->楼层名称->房间名称相似。在这种情况下,公司名称保持不变,园区名称保持不变。 位置的结构通常如下所示: +-----------+ | Org. Name | +-----+-----+ | +-----v-----+ +--------------------+|Campus Name|+---+--+-------------+ | +--+--------+ | | | | | | | | | | +--+-----+ +------+-+ +--+----+ +---+---+ +--+| BLDG-01|+--+ | BLDG-02| |BLDG-03| |Grounds| | +--------+ | +--------+ +-------+ +-------+ +-+------+ +-----+--+ |Floor-01| |Basement+-------+ +-+------+ …
10 oracle  query  view  hierarchy 

6
具有层次结构的表:创建约束以防止通过外键实现圆度
假设我们有一个对其自身具有外键约束的表,如下所示: CREATE TABLE Foo (FooId BIGINT PRIMARY KEY, ParentFooId BIGINT, FOREIGN KEY([ParentFooId]) REFERENCES Foo ([FooId]) ) INSERT INTO Foo (FooId, ParentFooId) VALUES (1, NULL), (2, 1), (3, 2) UPDATE Foo SET ParentFooId = 3 WHERE FooId = 1 该表将具有以下记录: FooId ParentFooId ----- ----------- 1 3 2 1 3 2 在某些情况下,这种设计可能是有道理的(例如,典型的“雇员与老板-雇员”关系),无论如何:在我的方案中有这种情况。 …

1
表存储的层次结构中的层次结构权限
假设以下数据库结构(如有需要,可以修改)... 我正在寻找一种确定给定页面上给定用户的“有效权限”的好方法,该方法允许我返回包含Page和有效权限的行。 我认为理想的解决方案可能包括使用CTE来执行递归的功能,以评估当前用户给定页面行的“有效权限”。 背景和实施细节 上面的架构表示内容管理系统的起点,在其中可以通过将用户添加到角色或从角色中删除来授予用户权限。 系统中的资源(例如页面)与角色关联,以授予链接到该角色的用户组所授予的权限。 这个想法是能够通过简单地拒绝所有角色并将树中的根级别页面添加到该角色,然后将用户添加到该角色来轻松锁定用户。 当(例如)为公司工作的承包商长期不可用时,这将允许许可结构保留在原位,然后通过简单地从该角色中删除用户,也将允许相同的原始权限授予。 权限基于典型的ACL类型规则,遵循这些规则可能适用于文件系统。 CRUD权限应为可为空的位,因此,在满足以下条件的情况下,可用值是true,false和未定义: 假+任何东西=假 正确+未定义=正确 真+真=真 未定义+未定义=未定义 如果任何权限为假->假 否则为true-> true 其他(所有未定义)-> false 换句话说,除非您通过角色成员资格授予任何权限,并且拒绝规则将覆盖允许规则,否则您将无任何权限。 应用于此权限的“集合”是指直到当前页面并包括当前页面的所有应用于树的权限,换句话说:如果将false应用于应用于此页面的树中任何页面的任何角色,则结果为false ,但是如果未定义到此处的整个树,则当前页面包含true规则,则此处的结果为true,但对父级而言将为false。 如果可能的话,我想宽松地保留db结构,同时请记住,我的目标是能够执行以下操作:select * from pages where effective permissions (read = true) and user = ?因此,任何解决方案都应能够使我拥有一个具有有效权限的可查询集。以某种方式(只要可以指定条件,返回它们是可选的)。 假设存在2个页面,其中1个是其他角色的子代,并且存在2个角色,一个用于admin用户,一个用于只读用户,这两个页面都仅链接到根级别页面,我希望看到这样的内容作为预期的输出: Admin user: Id, Parent, Name, Create, Read, Update, Delete 1, null, Root, True …

2
层次结构CLR是开源的吗?
内置的architectureid是CLR,它以有效的二进制形式存储路径,并提供其他有用的功能。 不幸的是,表示路径的深度是有限的,对于一棵二叉树来说大约是1427。我想为必然要达到此限制的复杂的现有应用程序增加该限制。我不想更改类型的界面。我不相信我可以开始更改类型的接口,而不会在所有必须更改的代码中引入细微的错误。 从理论上讲,我可以创建一个“ binhierarchyid” CLR UDT,它实现与hierarchicalid相同的接口,但仅支持二进制树。那应该使我的深度达到〜7000,同时仍保持在900字节的限制之内。不确定这项工作有多大。 是否可以在任何地方找到该architearchid CLR的来源,以便我可以基于它创建更深层次的结构呢?

2
我可以从自引用(分层)表中获取树结构吗?
给定这样的层次表: CREATE TABLE [dbo].[btree] ( id INT PRIMARY KEY , parent_id INT REFERENCES [dbo].[btree] ([id]) , name NVARCHAR(20) ); 我想获得整个树结构。 例如,使用以下数据: INSERT INTO [btree] VALUES (1, null, '1 Root'); INSERT INTO [btree] VALUES (2, 1, '1.1 Group'); INSERT INTO [btree] VALUES (3, 1, '1.2 Group'); INSERT INTO [btree] VALUES (4, …

1
如何用多个父母代表有向图?
http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html提供了一种用于从闭包表中插入和删除的算法。 除了节点可能具有多个父节点外,我想对类似的数据结构进行建模。 鉴于: 如果我们删除,[B, C]我期望最终得到: 如果我们删除节点,B我期望最终会得到: 但是,如果使用作者的算法删除链接或节点,则会注意到它标记[D, C, 1]为删除,这是不可取的。 到目前为止我尝试过的 我尝试通过添加一references列来适应原始数据结构,该列指示在两个节点之间有多少种行进方式。在上面的例子中,你可以从旅行A到C要么通过B或通过D。这个想法本来是要B删除的,从A到的路径C会保留,引用计数从2减少到1。从理论上讲这很好,但是我不知道如何使实现正常工作,现在我想知道是否这是有可能的(数据结构可能没有足够的信息来确定要删除的行)。 我在问什么 您将如何调整封闭表来支持多位家长?您会推荐哪些替代数据结构?https://stackoverflow.com/q/4048151/14731包含此类数据结构的详尽列表,但尚不清楚哪个数据结构支持(或最适合)多个父级。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.