2014-10-09 20 views
0

我的目標是確定字符串中字符串的重複次數。一個例子是在'abcdabcabcdeab'字符串中重複了多少次'ab'。在一個sql命令中創建測試表

進出口使用Oracle數據庫,並已經把這個命令:

with test as (Select 'abcdabcabcdeab' str, 'ab' ab) 
Select str, ab, (length(str) - length(replace (str, ab)))/length(ab); 
from test; 

不要擔心整個聲明,我的問題是什麼「以測試爲(選擇...)」做嗎?

我的猜測是它創建了一個名爲test的表,它將以名稱Select 'abcdabcabcdeab' str, 'ab' ab顯示 - 我不明白with如何創建表?

+5

這是一個通用表格表達式(也稱爲CTE)。它與from子句中的派生表沒有什麼不同,只是更容易閱讀。 – Andrew 2014-10-09 15:38:10

+0

也稱爲[subquery factoring](http://docs.oracle.com/cd/E11882_01/server.112/e10592/statements_10002.htm#i2077142)。 – 2014-10-09 15:55:32

回答

0

一般來講,如果你有一個情況下,我們需要在同一subquery多次重新定義,而是直接使用已定義的查詢名稱WITH子句,使查詢更容易閱讀。也許,這就是爲什麼它被稱爲subquery factoring

例如,

使用SCOTT模式,爲每一位員工,我們想知道其他人有多少是在他們的部門。使用內聯視圖,我們可以執行以下操作。

SELECT e.ename AS employee_name, 
     dc.dept_count AS emp_dept_count 
FROM emp e, 
     (SELECT deptno, COUNT(*) AS dept_count 
     FROM emp 
     GROUP BY deptno) dc 
WHERE e.deptno = dc.deptno; 

使用WITH子句如下所示。

WITH dept_count AS (
    SELECT deptno, COUNT(*) AS dept_count 
    FROM emp 
    GROUP BY deptno) 
SELECT e.ename AS employee_name, 
     dc.dept_count AS emp_dept_count 
FROM emp e, 
     dept_count dc 
WHERE e.deptno = dc.deptno; 

這裏的區別似乎相當微不足道。 如果我們還想撤回每個員工經理姓名和經理部門中的人數,該怎麼辦?使用內聯視圖,現在看起來像這樣。

SELECT e.ename AS employee_name, 
     dc1.dept_count AS emp_dept_count, 
     m.ename AS manager_name, 
     dc2.dept_count AS mgr_dept_count 
FROM emp e, 
     (SELECT deptno, COUNT(*) AS dept_count 
     FROM emp 
     GROUP BY deptno) dc1, 
     emp m, 
     (SELECT deptno, COUNT(*) AS dept_count 
     FROM emp 
     GROUP BY deptno) dc2 
WHERE e.deptno = dc1.deptno 
AND e.mgr = m.empno 
AND m.deptno = dc2.deptno; 

使用WITH子句,如下所示。

WITH dept_count AS (
    SELECT deptno, COUNT(*) AS dept_count 
    FROM emp 
    GROUP BY deptno) 
SELECT e.ename AS employee_name, 
     dc1.dept_count AS emp_dept_count, 
     m.ename AS manager_name, 
     dc2.dept_count AS mgr_dept_count 
FROM emp e, 
     dept_count dc1, 
     emp m, 
     dept_count dc2 
WHERE e.deptno = dc1.deptno 
AND e.mgr = m.empno 
AND m.deptno = dc2.deptno; 

因此,底線是,我們不需要多次重新定義相同的子查詢。相反,我們只需使用WITH子句中定義的查詢名稱,使查詢更容易閱讀。

更多詳細信息here

0

它是一個CTE,也稱爲子查詢保理。

  • SQL WITH子句只適用於Oracle 9i release 2及更高版本。
  • 形式上,WITH子句被稱爲子查詢分解
  • 當子查詢執行多次WITH子句SQL用於
  • 爲遞歸查詢(SQL-99,但不包括Oracle SQL)
同樣有用

我們也可以使用SQL-99 WITH子句來代替臨時表。 Oracle SQL WITH子句將計算一次聚合,給它一個名稱,並允許我們在查詢中稍後引用它(可能是多次)。

引用About Oracle WITH clauseOracle Subquery FactoringUsing the WITH clause to simplify complex SQL感謝Andrew

+0

Oracle支持11gR2中的[遞歸子查詢因子分析](http://docs.oracle.com/cd/E11882_01/server.112/e10592/statements_10002.htm#BCEJGIBG)。 – 2014-10-09 15:57:24