Sql Oracle连接操作
我已经通读了有关连接操作的文章,但我似乎无法理解现有应用程序中的数据库查询。下面是查询的简化版本Sql Oracle连接操作,sql,oracle,hierarchical,Sql,Oracle,Hierarchical,我已经通读了有关连接操作的文章,但我似乎无法理解现有应用程序中的数据库查询。下面是查询的简化版本 SELECT LEVEL, CONNECT_BY_ROOT MY_MONTH MY_LABEL, b.* FROM ( SELECT ROWNUM AS ORDERING, MY_AREA, TRUNC (THE_MONTH, 'MONTH') AS MY_MONTH FROM MY_TABLE ORD
SELECT LEVEL,
CONNECT_BY_ROOT MY_MONTH MY_LABEL,
b.*
FROM (
SELECT ROWNUM AS ORDERING,
MY_AREA,
TRUNC (THE_MONTH, 'MONTH') AS MY_MONTH
FROM MY_TABLE
ORDER BY MY_AREA, MY_MONTH DESC
) b
WHERE LEVEL <= 3
START WITH 1 = 1
CONNECT BY PRIOR MY_AREA = MY_AREA
AND PRIOR ORDERING = ORDERING - 1
AND PRIOR MY_MONTH <= ADD_MONTHS(MY_MONTH, 6);
虽然我对连接功能有了基本的了解,但这种结合让我迷失了方向。有人能解释一下这个问题是怎么回事吗
我想结尾是要让所有的行都有相同的面积,行号比当前行号少1,日期比当前日期晚6个月。我猜由于行号标准,这只会返回1行,如果不满足其他标准,则返回0行。然后,也许第一个CONNECT\u BY\u ROOT表示要获取该行的“我的月”值 从b开始,b是一个表,其中包含MY_AREA a number?,MY_MONTH是一个月截断日期,即天数都设置为01,以及一个别名ROWNUM,它由ORDER by子句确定,ORDER by是MY_AREA,MY_MONTH DESC,例如:
WHERE子句直到稍后才起作用,所以继续从开始,它只表示1=1。这意味着b中的每一行都将用于查询;如果您在此处遇到其他情况,例如my_area<5或其他情况,则只会使用某一组行
现在是connectby,它决定了应该如何构建层次结构。这类似于WHERE子句,除了特殊的Previor关键字,它告诉DB查看层次结构中的上一级。因此:
PRIOR MY_AREA=MY_AREA意味着子节点必须具有与“MY_AREA”相同的值
Previor ORDERING=ORDERING-1表示子节点应该位于b的排序中的当前节点之后一行。
在我的_月之前,如果孩子必须比父母早一行,怎么会有超过两个级别?另外,您可能需要对表重新排序,首先排序是asc。面积是一个字符串。我仍然不知道排序标准。与表的第3部分一样,3个排序根包含1个排序行。这如何满足先前的排序=排序-1?哦。可能前一行是指根或最后一个子行,即最后一行是什么?Hrm。还有一些问题。我的结果的第一部分有3个级别。所有的行都包含了START with 1=1;也就是说,所有行都成为它们自己的树的根。
+----------+---------+-----------+
| 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 |
+----------+---------+-----------+
+-------+-----------+----------+---------+-----------+
| 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 |
+-------+-----------+----------+---------+-----------+