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

标签 sql oracle

我的要求是找出一个月内所有失效的天数。以下是我的示例查询。

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;

我的 Query 1 运行良好,但 Query 2 显示重复记录。为什么?

最佳答案

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

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

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

所以,

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 级)。

然后,你的CONNECT BY之后处理(如上所示),WHERE子句被应用,将您的最终结果限制为值(在层次结构的最低级别)为 SNO = 1 的行.这恰好是 30 行或 15 行的一半,这就是你得到的。

关于sql - 为什么我的层次结构查询显示重复记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52950407/

相关文章:

sql - Oracle SQL-认为缺少正确的括号

sql - ORACLE 通过排除一个字段进行选择和分组

sql - Between 子句 - 我是否必须重新排序参数?

sql - 在sql oracle中格式化单列中的名称

sql - 如何在另一个游标内声明一个游标

java - 如何从存储过程返回多行?

SQL查询根据列名获取表名和行数”

php - 如何在 MySQL 中搜索名字和姓氏?

mysql - 查询每个CEO的店铺类型数量以及所在城市的最大商品数量

sql - 添加日期不超过一个月