我有一个分层的数据库结构,例如列,ID并且PARENT_ID为每行定义,顶层的行有一个NULL PARENT_ID。
PARENT_ID
NULL PARENT_ID
我已将此表中的所有关系展平到另一个表中,例如,如果在祖父母,父母,孙子的单个层次结构中有三个记录,则将有3个记录:
**ANCESTOR, DESCENDANT** grantparent, parent grandparent, grandchild parent, grandchild
无需执行分层查询来确定孙子是祖父母的后代,我可以简单地检查(grandparent, grandchild)该扁平化表中是否存在记录。
(grandparent, grandchild)
我的问题是,使用这个展平的表,我如何最有效地返回两个节点之间的所有记录。使用带有grandparent和grandchild作为参数的示例,如何获取(grandparent, parent)记录。
grandparent
grandchild
(grandparent, parent)
我不想使用分层查询来解决此问题…我想知道是否有可能在没有任何联接的情况下做到这一点。
SELECT * FROM mytable WHERE descendant = @descendant AND hops < ( SELECT hops FROM mytable WHERE descendant = @descendant AND ancestor = @ancestor )
当@ancestor不是真正@descendant的祖先时,这将自动处理。
创建索引(descendant, hops)以使其快速运行。
(descendant, hops)