开发者社区 问答 正文

我如何记住CONNECT BY查询中应该围绕PRIOR采取哪种方式

我的记忆力很差。每当我在Oracle中执行CONNECT BY查询时- 每次都意味着-我必须认真思考,通常通过反复试验来确定PRIOR应该使用哪个参数。

我不知道为什么我不记得-但是我不记得。

有没有人有方便的记忆助记符,所以我总是记得吗?

例如:

要从节点上掉下来一棵树-显然我必须查一查:)-您可以执行以下操作:

select * from node connect by prior node_id = parent_node_id start with node_id = 1 所以-我从node_id1的a(分支的顶部)开始,查询查找parent_node_id= 1的所有节点,然后向下迭代到树的底部。

要上树,先验先于父级:

select * from node connect by node_id = prior parent_node_id start with node_id = 10 因此,从分支的某处开始(node_id = 10在这种情况下),Oracle首先获取的所有节点parent_node_id与的node_id10相同。

编辑:我仍然错了,所以我想添加一个澄清的编辑以扩展接受的答案-这就是我现在记得的方式:

select * from node connect by prior node_id = parent_node_id start with node_id = 1 我现在将这个SQL的“英语”版本读为...

在NODE中,从中的行开始,node_id = 1所选的下一行的值parent_node_id 等于node_id上一行(优先级)的值。

编辑:Quassnoi提出了一个很好的建议-编写SQL的顺序使事情变得容易得多。

select * from node start with node_id = 1 connect by parent_node_id = prior node_id 这让我感觉很清楚-“开始于”给出了选择的第一行,“连接依据”给出了下一行(在这种情况下,node_id = 1的子代)。

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-18 16:22:41 587 分享 版权
1 条回答
写回答
取消 提交回答
  • 我总是尝试JOIN按以下顺序将表达式放入中:

    joined.column = leading.column 该查询:

    SELECT t.value, d.name FROM transactions t JOIN dimensions d ON d.id = t.dimension 可以像“对于每个交易,找到对应的维名称”或“对于每个维度,找到所有对应的交易值”一样对待。

    因此,如果我搜索给定的交易,则会按以下顺序放置表达式:

    SELECT t.value, d.name FROM transactions t JOIN dimensions d ON d.id = t.dimension WHERE t.id = :myid ,如果我搜索尺寸,则:

    SELECT t.value, d.name FROM dimensions d JOIN transactions t ON t.dimension = d.id WHERE d.id = :otherid 前一个查询很可能首先在上使用索引扫描(t.id),然后在(d.id)上使用,而后一个查询将首先在上使用索引扫描(d.id),然后在上使用(t.dimension),您可以在查询本身中轻松地看到它:搜索字段位于左侧。

    在中,驱动表和从动表可能不是很明显JOIN,但对于CONNECT BY查询来说却很清楚:PRIOR行在驱动,非PRIOR在驱动。

    这就是为什么此查询:

    SELECT * FROM hierarchy START WITH id = :root CONNECT BY parent = PRIOR id 表示“查找parent给定的所有行id”。此查询建立层次结构。

    可以这样处理:

    connect_by(row) { add_to_rowset(row);

    /* parent = PRIOR id / / PRIOR id is an rvalue */ index_on_parent.searchKey = row->id;

    foreach child_row in index_on_parent.search { connect_by(child_row); } } 而这个查询:

    SELECT * FROM hierarchy START WITH id = :leaf CONNECT BY id = PRIOR parent 表示“查找id给定的行parent”。该查询将建立一个祖先链。

    始终放在PRIOR表达式的右侧。

    可以PRIOR column将所有行都视为常量。

    2019-11-18 16:22:56
    赞同 展开评论
问答分类:
问答地址: