我的目标是确定字符串在字符串中重复的次数。一个例子是多少次' 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
如何创建表格?
答案 0 :(得分:0)
它是一个CTE,也称为子查询因子。
我们也可以使用SQL-99 WITH子句而不是临时表。 Oracle SQL WITH子句将计算聚合一次,为其命名,并允许我们在查询的后面引用它(可能多次)。
参考About Oracle WITH clause,Oracle Subquery Factoring,Using 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