關於inline view內嵌檢視的學習

bisal發表於2013-09-23

看一篇的時候碰巧看到有關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。

The query
---------
select count(*) 
  from (select count(*) as numLLEids 
          from LaborLevelEntry  
          where ((upper(NAME) = upper( N'Division2') 
                AND LABORLEVELDEFID = 1 AND inActive=0)
                OR (upper(NAME) = upper( N'Department999999') 
                AND LABORLEVELDEFID = 2 AND inActive=0)) 
          group by laborleveldefid) numrows ;
 
11.1.0.6: (good results)
 
  COUNT(*)
----------
        2
 
11.1.0.7: (wrong results)
 
  COUNT(*)
----------
         1
         1
 
Disabling view merging in 11.1.0.7 we got the good results.
 

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

找了一個10g的庫,看到_simple_view_merging隱含引數是TRUE,該引數是預設開啟的。

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


另外,這篇博文(http://hi.baidu.com/optical/item/cfc7c0ea0d94d8e2fb42ba5d)中提到內嵌檢視與子查詢(subquery)的區別:

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;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7192724/viewspace-773022/,如需轉載,請註明出處,否則將追究法律責任。

相關文章