(1 = 1)のOracle接続

全員:

 いいです!最近、オラクル接続でon(1 = 1)の問題が発生しましたが、これは非常に興味深いことです。

テストテーブルは次のとおりです。

create table t1(c1 varchar2(10));
insert into t1 values('1');
insert into t1 values('2');


create table t2(c2 varchar2(10));
insert into t2 values('1');

単純なテーブル、最大2つのデータ、次のクエリの結果はどうなりますか?

SELECT T1.C1, T2.C2, T3.C3
  FROM T1
  JOIN T2
    ON (1 = 1)
  LEFT JOIN (SELECT 1 AS C3 FROM DUAL UNION ALL SELECT 2 FROM DUAL) T3
    ON (T1.C1 = T2.C2)

実行計画を直接見てください

SQL> SELECT T1.C1, T2.C2, T3.C3
  2    FROM T1
  3    JOIN T2
  4      ON (1 = 1)
  5    LEFT JOIN (SELECT 1 AS C3 FROM DUAL UNION ALL SELECT 2 FROM DUAL) T3
  6      ON (T1.C1 = T2.C2);


执行计划
----------------------------------------------------------                                          
Plan hash value: 769723218                                                                          
                                                                                                    
------------------------------------------------------------------------------                      
| Id  | Operation             | Name | Rows  | Bytes | Cost (%CPU)| Time     |                      
------------------------------------------------------------------------------                      
|   0 | SELECT STATEMENT      |      |     4 |    68 |    14   (0)| 00:00:01 |                      
|   1 |  NESTED LOOPS OUTER   |      |     4 |    68 |    14   (0)| 00:00:01 |                      
|   2 |   MERGE JOIN CARTESIAN|      |     2 |    28 |     6   (0)| 00:00:01 |                      
|   3 |    TABLE ACCESS FULL  | T2   |     1 |     7 |     3   (0)| 00:00:01 |                      
|   4 |    BUFFER SORT        |      |     2 |    14 |     3   (0)| 00:00:01 |                      
|   5 |     TABLE ACCESS FULL | T1   |     2 |    14 |     3   (0)| 00:00:01 |                      
|   6 |   VIEW                |      |     2 |     6 |     4   (0)| 00:00:01 |                      
|*  7 |    FILTER             |      |       |       |            |          |                      
|   8 |     VIEW              |      |     2 |     6 |     4   (0)| 00:00:01 |                      
|   9 |      UNION-ALL        |      |       |       |            |          |                      
|  10 |       FAST DUAL       |      |     1 |       |     2   (0)| 00:00:01 |                      
|  11 |       FAST DUAL       |      |     1 |       |     2   (0)| 00:00:01 |                      
------------------------------------------------------------------------------                      
                                                                                                    
Predicate Information (identified by operation id):                                                 
---------------------------------------------------                                                 
                                                                                                    
   7 - filter("T1"."C1"="T2"."C2")                                                                  
                                                                                                    
Note                                                                                                
-----                                                                                               
   - dynamic sampling used for this statement (level=2)                                             


统计信息
----------------------------------------------------------                                          
          0  recursive calls                                                                        
          0  db block gets                                                                          
         14  consistent gets                                                                        
          0  physical reads                                                                         
          0  redo size                                                                              
        583  bytes sent via SQL*Net to client                                                       
        416  bytes received via SQL*Net from client                                                 
          2  SQL*Net roundtrips to/from client                                                      
          1  sorts (memory)                                                                         
          0  sorts (disk)                                                                           
          3  rows processed                                                                         

個人的な理解:1。id= 2からわかるように、t1とt2はデカルト積です
        。2id= 7からわかるように、t3に関連付けられた条件はfilter( "T1"。 "C1" = "T2です。 "。" C2 ")は少し理解しにくいですが、確かに文法的です

まず、id = 2の推測が正しいかどうかを確認します

デカルト積予想が正しいことがわかり、最終結果は次のようになります。

アソシエーション条件にはt3の制限条件がないため、アソシエーション後のデカルト積「1,1」が再度実行されていることがわかります。

左結合はt3の関連付けに使用されるため、結果には3番目の行があります。内部結合に置き換えると、3行目が消えますか?

結果は正しい

 

 

 

おすすめ

転載: blog.csdn.net/zhaoxiangchong/article/details/90039111