oracle where clause,如何在Oracle的分层查询中执行WHERE-CLAUSE

在Oracle分层查询中,应在Oracle文档中的Connect-By操作符之后评估WHERE-CLAUSE。

但是有一些复杂的情况:如果WHERE-CLAUSE包含JOIN样式限定,就像oracle所说的那样,Join-Style限定条件应该在Connect-By操作符之前进行评估,而另一个只能指向一个关系的非Join样式应该是在Connect-By操作符之后评估。

所以问题是:如何将WHERE-CLAUSE中的资格区分为两部分,一部分在Connect-By运算符之前评估,另一部分在Connect-By运算符之后评估。

example:

SQL> desc bar

Name Null? Type

----------------------------------------- -------- -----------------

B1 NUMBER(38)

B2 NUMBER(38)

SQL> desc foo;

Name Null? Type

----------------------------------------- -------- -----------------

F1 NUMBER(38)

F2 NUMBER(38)

SQL> set pagesize 3000

SQL> set linesize 3000

SQL> explain plan for select * from foo, bar where

2 **f1=b1 and (b2 = 1 or f1=b2 and b1=1 or f2=b1+1) and f1 is not null**

3 connect by level < 10;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------------

Plan hash value: 2657287368

--------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

--------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 52 | 5 (20)| 00:00:01 |

|* 1 | FILTER | | | | | |

|* 2 | CONNECT BY WITHOUT FILTERING| | | | | |

|* 3 | HASH JOIN | | 1 | 52 | 5 (20)| 00:00:01 |

| 4 | TABLE ACCESS FULL | FOO | 1 | 26 | 2 (0)| 00:00:01 |

| 5 | TABLE ACCESS FULL | BAR | 1 | 26 | 2 (0)| 00:00:01 |

--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - **filter(("B2"=1 OR "B1"=1) AND "F1" IS NOT NULL)**

2 - filter(LEVEL<10)

3 - **access("F1"="B1")**

**filter("F1"="B2" OR "F2"="B1"+1)**

Note

-----

- dynamic sampling used for this statement

24 rows selected.因此,如上图所示,WHERE中的条件f1 = b1和(b2 = 1或f1 = b2和b1 = 1或f2 = b1 + 1)和f1不为null,

已成为两部分:

一个:过滤器((“B2”= 1或“B1”= 1)AND“F1”不为空) - >连接后评估

另一个:在连接之前将过滤器(“F1”=“B2”或“F2”=“B1”+1)和访问(“F1”=“B1”) - >评估为JOIN-ON

那么,谁可以解释如何区分WHERE子句中的条件以及如何在连接之前或之后应用WHERE子句中的两个部分?

谢谢。

谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值