我的记忆力很差。每当我在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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
我总是尝试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将所有行都视为常量。