全員:
いいです!最近、オラクル接続で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行目が消えますか?
結果は正しい