在一个sql命令中创建测试表

时间:2014-10-09 15:32:42

标签: sql oracle relational-database

我的目标是确定字符串在字符串中重复的次数。一个例子是多少次' ab'在字符串' abcdabcabcdeab'中重复。

我正在使用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如何创建表格?

2 个答案:

答案 0 :(得分:0)

它是一个CTE,也称为子查询因子。

  • SQL WITH子句仅适用于Oracle 9i第2版及更高版本。
  • 形式上,WITH子句称为子查询因子分析
  • 多次执行子查询时使用SQL WITH子句
  • 对递归查询(SQL-99,但不是Oracle SQL)也很有用

我们也可以使用SQL-99 WITH子句而不是临时表。 Oracle SQL WITH子句将计算聚合一次,为其命名,并允许我们在查询的后面引用它(可能多次)。

参考About Oracle WITH clauseOracle Subquery FactoringUsing the WITH clause to simplify complex SQL谢谢Andrew

答案 1 :(得分: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