gpt4 book ai didi

sql - Oracle分层查询中如何使用WHERE-CLAUSE

转载 作者:行者123 更新时间:2023-12-02 17:59:11 31 4
gpt4 key购买 nike

在Oracle分层查询中,WHERE-CLAUSE应该在oracle文档中的Connect-By运算符之后进行评估。

但也存在复杂的情况:如果 WHERE-CLAUSE 包含 JOIN 样式限定,正如 oracle 所说,则应在 Connect-By 运算符和其他仅引用一个的非 Join 样式之前评估 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 and (b2 = 1 or f1=b2 and b1=1 or f2=b1+1) and f1 is not null,变成了两部分:

one: filter(("B2"=1 OR "B1"=1) AND "F1"IS NOT NULL) --> 在连接后进行评估

另一个:filter("F1"="B2"OR "F2"="B1"+1) 和 access("F1"="B1") --> 连接前评估-通过作为 JOIN-ON

那么,谁能解释一下如何区分 WHERE 子句中的条件以及如何从 WHERE 子句中形成两部分并在 connect-by 之前或之后应用?

谢谢。

谢谢。

最佳答案

您不应使用隐式联接,而应使用显式JOIN

一旦执行此操作,您就可以区分“真实”where 条件和连接条件。

我不清楚(这是使用隐式连接语法的结果)您到底想要使用什么作为连接条件以及使用什么作为 where 条件。

将您的查询重写为如下内容:

from foo
join bar on foo.f1 = bar.b1
where bar.b2 = 1 or ....
and f1 is not null
connect by level < 10;

条件f1不为空似乎没有必要(即使在您的初始查询中),因为如果f1为空,连接将不会产生任何结果。

关于sql - Oracle分层查询中如何使用WHERE-CLAUSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11498199/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com