天天看點

關于inline view内嵌視圖的學習

看一篇的時候碰巧看到有關inline view的概念,不太熟悉,查了下。

所謂inline view,也叫内前視圖,說白了,就是執行的時候才建立的視圖。例如select ... from (select ... from (select ...)),這裡作為from表來使用的select語句建立的就是一個内嵌視圖,個人了解,之是以叫内嵌,就是因為它是放在一個語句中的,而且可以多次嵌套,但這種内嵌視圖隻能在目前的SQL中使用,不能像CREATE VIEW建立的視圖那樣重複使用,不是一個實際存在的對象。

再來看看Concept中對它的定義:

Inline Views

An inline view is not a schema object. It is a subquery with an alias (correlation name) that you can use like a view within a SQL statement.

感覺它就是一個SQL的使用技巧,可以讓你不用CREATE VIEW顯示建立一個視圖,不用維護它,隻需要在SQL中使用嵌套,就可以使用視圖封裝查詢結果的特性。

再看看MOS上有什麼關于inline view的介紹。找到一個SELECT With An INLINE VIEW Fails With ORA-600 [9999] (文檔 ID 1068871.1),指出在11.1.0.7存在一個bug。

這個問題主要是在這個版本的Oracle中,使用上面的inline view查詢的結果是分組的樣式,關閉隐含參數_simple_view_merging可以得到正确結果,或者給該版本打一個更新檔Patch 8327137也行。

找了一個10g的庫,看到_simple_view_merging隐含參數是TRUE,該參數是預設打開的。

(正如白鳝所說,這種從不同參考抓到的知識點,往往隻是獨立的,如果能關聯起來那就最好了,這裡僅此留個記處,希望未來能用到)。

A subquery (sub-query) is a SELECT statement in the WHERE- or HAVING-clause of another SELECT statement.

Example subqueries:

Subquery executes first and feeds output into the main query:

SELECT ename, deptno

  FROM emp

 WHERE deptno = (SELECT deptno

                   FROM emp

                  WHERE ename = 'TAYLOR');

Correlated subquery (both executes simultaneously):

SELECT ename, deptno, sal

  FROM emp x

  WHERE sal > (SELECT AVG(sal)

        FROM emp

        WHERE emp.deptno = x.deptno)

  ORDER BY deptno;