为什么我的层次结构查询显示重复记录?

2024-05-06

我的要求是找到一个月中所有过去的天数。以下是我的示例查询。

CREATE TABLE custom.date_full (
    sno         NUMBER,
    curr_date   DATE);

INSERT INTO custom.date_full VALUES ( 1,'27-sep-2018' );
INSERT INTO custom.date_full VALUES ( 2,'27-sep-2018' );

--Query:1 - RETURNS 4 RECORDS AS EXPECTED
 SELECT  curr_date, 
        TRUNC (curr_date, 'MM') + LEVEL - 1 AS DAY,
        LEVEL 
   FROM (SELECT * FROM custom.date_full WHERE sno=1)
CONNECT BY level<=4
  ORDER BY DAY;

--Query 2: RETURNS 15 RECORDS WITH DUPLICATES
SELECT  curr_date, 
        TRUNC (curr_date, 'MM') + LEVEL - 1 AS DAY,
        LEVEL 
   FROM custom.date_full 
  WHERE sno=1
CONNECT BY level<=4
  ORDER BY DAY;

My Query 1效果很好但是Query 2显示重复记录。为什么?


你不明白如何CONNECT BY作品。以下是 Oracle 如何评估第二个查询的演练。

没有START WITH子句,表中的每一行都可以用作层次结构中的起点或“根”。

既然你没有CONNECT BY条件(例如“columnA = PRIOR columnB”),表中的每一行都将被视为每隔一行的子行。这将永远发生,直到你LEVEL <=4条件达到。

So,

LEVEL 1
--------
SNO 1
SNO 2

说明:表中的每一行都是其自身层次结构的起点(因为您没有START WITH状况)。

LEVEL 2
--------
SNO 1 -> SNO 1
SNO 1 -> SNO 2 
SNO 2 -> SNO 1
SNO 2 -> SNO 2

这 4 行的解释 - SNO 1 和 SNO 2 都是根,对于每个根,SN​​O 1 和 SNO 2 都是子根。因此,2x2 行 = 4 行。

LEVEL 3 
-------
SNO 1 -> SNO 1 -> SNO 1
SNO 1 -> SNO 1 -> SNO 2
SNO 1 -> SNO 2 -> SNO 1 
SNO 1 -> SNO 2 -> SNO 2 
SNO 2 -> SNO 1 -> SNO 1
SNO 2 -> SNO 1 -> SNO 2
SNO 2 -> SNO 2 -> SNO 1
SNO 2 -> SNO 2 -> SNO 2

这 8 行的解释。从第 2 级的 4 行开始,SNO 1 和 SNO 2 都是各自的子级,因此第 3 级有 4x2 = 8 行。

第 4 级(我不会画出来)同样会给出 8x2 = 16 行。

因此,总共有 2 + 4 + 8 + 16 = 30 行。 (即1级+2级+3级+4级)。

Then, after your CONNECT BY处理(如上所示),WHERE应用子句,将最终结果限制为值(位于层次结构的最低级别)为的行SNO = 1。这正是您所得到的 30 行或 15 行的一半。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的层次结构查询显示重复记录? 的相关文章

随机推荐