oracle ORA 01417多表左外連線

2021-08-21 07:52:39 字數 1625 閱讀 8094

drop

table test1 purge;

drop

table test2 purge;

drop

table test3 purge;

create

table test1 (id number

primary

key);

create

table test2 (id number);

create

table test3 (dept_id number,measure_id number);

insert

into test1 values(1);

insert

into test1 values(2);

insert

into test1 values(3);

insert

into test2 values(10);

insert

into test2 values(20);

insert

into test3 values(1,10);

commit;

select *

from test1, test2, test3

where test1.id = test3.dept_id(+)

and test2.id = test3.measure_id(+);

在11g會報錯:

在12c是支援的

解決方式:

方式1:先合併

select *

from (select test1.id dept_id, test2.id measure_id from test1, test2) a,

test3

where a.dept_id = test3.dept_id(+)

and a.measure_id = test3.measure_id(+);

方式2:ansi語法

--橫向檢視是乙個檢視,它引用來自不在檢視中的表中的列。

--在oracle11g執行這種查詢的唯一方法是將其轉換為ansi語法。但是,這種ansi語法的實現會導致使用橫向檢視。

--oracle無法合併橫向檢視,因此優化器的計畫選擇受到連線順序和聯接方法的限制,這可能導致不是最優計畫

select *

from test1 cross

join test2

left

join test3

on (test1.id = test3.dept_id and test2.id = test3.measure_id);

看下執行計畫:

上面的2種方式都是一樣的執行計畫,

這裡可以看到,id=2的檢視在oracle11g是無法合併的;這就可能會丟失最優的執行計畫

在12c則可以合併;

參考:

sql 左外連語句解析

string sqlstring declare str varchar 1000 宣告變數 str,並定義型別 select top 1 str coursetypelist from dbo.sys grade where gid 按照gid 相當於ddl grade.selectedvalue...

連表查詢(內連線,左外連線,右外連線)

用兩個表 a table b table 關聯欄位a table.a id和b table.b id來演示一下mysql的內連線 外連線 左 外 連線 右 外 連線 全 外 連線 mysql版本 server version 5.6.31 mysql community server gpl 資料庫...

Lambda表示式多表連線的左連

在網上有很多人都在查詢lambda的例子,但是完整的例子不多,況且還有相當一部分幾乎完全不能用,linq的左連倒是挺多的,但是linq的 相對比較少,一旦遇到重複資料的時候,不容易被過濾,lambda就可以輕鬆避免這個讓人頭疼的問題。廢話不多說,看下面的例子吧。var model main from...