country 表的数据是这样的,一看就明白的,pid 是父节点的id,现在想自连接查询。
从父节点向子节点方向得到树结构,
sql :
select * from country start with pid = 0 connect by prior id = pid;
查询结果为:
现在有个需求想从子节点向父节点方向得到树结构
于是需要改变sql :
select * from country start with pid = 12 connect by id = prior pid;
总结一下:
此处摘自:http://hi.baidu.com/leslytt/item/d2a281bced80044a2bebe322
1) prior:被放置于等号前后的位置,决定着查询时的检索顺序。
PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。例如:
CONNECT BY PRIOR id = 父id
PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:
CONNECT BY id=PRIOR 父id
2) connect by:说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。
3) start with:不但可以指定一个根节点,还可以指定多个根节点
表结构的定义:id(子) ,root_id(父)
prior id(子) 即一直检索子结点,就是自顶向下
prior root_id(父) 即一直检索父结点,就是自底向上