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...