以 开头b
,它是一个包含MY_AREA
(数字?)的表MY_MONTH
, 是一个截断月份的日期(即天都设置为01
),以及一个别名ROWNUM
,它由ORDER BY
子句确定,即ORDER BY MY_AREA, MY_MONTH DESC
,例如:
+----------+---------+-----------+
| ORDERING | MY_AREA | MY_MONTH |
+----------+---------+-----------+
| 1 | 10 | 01-SEP-12 |
| 2 | 10 | 01-JAN-12 |
| 3 | 12 | 01-AUG-12 |
| 4 | 12 | 01-JUN-12 |
| 5 | 12 | 01-MAY-12 |
| 6 | 12 | 01-JAN-12 |
| 7 | 12 | 01-JAN-10 |
+----------+---------+-----------+
该WHERE
子句直到稍后才会发挥作用,因此请继续使用START WITH
,它仅表示1 = 1
。这意味着b
查询中将使用每一行;如果您在这里有其他条件,例如my_area < 5
或其他情况,则只会使用特定的一组行。
现在,CONNECT BY
,它决定了应该如何构建层次结构。这就像一个WHERE
子句,除了PRIOR
告诉数据库查看层次结构中的上一层的特殊关键字。所以:
PRIOR MY_AREA = MY_AREA
只是意味着子节点必须具有相同的“MY_AREA”值
PRIOR ORDERING = ORDERING - 1
表示子节点应该在的排序中的当前节点之后排一排。b
PRIOR MY_MONTH <= ADD_MONTHS(MY_MONTH, 6)
意味着为了加入层次结构,前一个MY_MONTH
应该在当前节点日期之后的 6 个月或更短的时间内。
然后创建整个层次结构。LEVEL
(special for CONNECT BY
...) 设置为层次结构中的级别,CONNECT_BY_ROOT
给出该层次结构MY_MONTH
的根的值并将其别名为MY_LABEL
. 在此之后,该表将类似于下表。为了清楚起见,我为每个层次结构添加了分隔符。
+-------+-----------+----------+---------+-----------+
| LEVEL | MY_LABEL | ORDERING | MY_AREA | MY_MONTH |
+-------+-----------+----------+---------+-----------+
| 1 | 01-SEP-12 | 1 | 10 | 01-SEP-12 |
+-------+-----------+----------+---------+-----------+
| 1 | 01-JAN-12 | 2 | 10 | 01-JAN-12 |
+-------+-----------+----------+---------+-----------+
| 1 | 01-AUG-12 | 3 | 12 | 01-AUG-12 |
| 2 | 01-AUG-12 | 4 | 12 | 01-JUN-12 |
| 3 | 01-AUG-12 | 5 | 12 | 01-MAY-12 |
| 4 | 01-AUG-12 | 6 | 12 | 01-JAN-12 |
+-------+-----------+----------+---------+-----------+
| 1 | 01-JUN-12 | 4 | 12 | 01-JUN-12 |
| 2 | 01-JUN-12 | 5 | 12 | 01-MAY-12 |
| 3 | 01-JUN-12 | 6 | 12 | 01-JAN-12 |
+-------+-----------+----------+---------+-----------+
| 1 | 01-MAY-12 | 5 | 12 | 01-MAY-12 |
| 2 | 01-MAY-12 | 6 | 12 | 01-JAN-12 |
+-------+-----------+----------+---------+-----------+
| 1 | 01-JAN-12 | 6 | 12 | 01-JAN-12 |
+-------+-----------+----------+---------+-----------+
| 1 | 01-JAN-10 | 7 | 12 | 01-JAN-10 |
+-------+-----------+----------+---------+-----------+
因此,如您所见,每一行都出现在其自身层次结构的顶部,所有节点都满足其下的CONNECT BY
条件。
最后,WHERE
应用该子句;这会切断> 3
每个层次结构中的所有级别,因此您最多只剩下 3 个级别。这仅影响中间层次结构中的一行,即LEVEL
= 4 的行。