SQL WITH SELECT如何遍历

时间:2018-11-12 06:25:40

标签: sql postgresql-9.6

我正在努力实现以下目标:

我有两个大表,它们之间没有公用密钥。显然,当我想加入它们时,它是笛卡尔积,例如m x n行。我想避免这种情况。我将从tableA中读取一条记录,然后将其与tableB的所有行进行匹配,但是至少我将控制在tableA中处理了多少条记录。

当前,我不知道查询执行了多远。

我的问题是我可以在WITH语句中这样做吗?

我以一个简单的例子为例,EMP中的SCOTT/TIGER表和一次记录将与DEPT表匹配并返回DNAME。我已经写了这个查询,但是没有按预期做。以及如何从第二个查询中引用DNAME

with emp_rec as (select * from emp),
     dept_rec as (select dname 
      from   dept, emp_rec
      where  dept.deptno in (10, 20) and 
             dept.deptno = emp_rec.deptno)
select * 
from emp_rec

我期望的结果类似于在emp / deptno = dept / deptno上连接EMP和DEPT表。但是我想一次做一个EMP记录,而没有纯SQL中的CURSOR或STORED PROCEDURE。希望我能够解释我的想法。

我做错了什么,请帮忙。 谢谢

嗨,

我已经能够解决我的问题。我没有从EMP_REC中进行SELECTING更改为DEPT_REC,而是有效。这是新的查询:

with emp_rec as (select * from emp),
     dept_rec as (select emp_rec.*, dname 
      from   dept, emp_rec
      where  dept.deptno in (10, 20) and 
             dept.deptno = emp_rec.deptno)
select * 
from dept_rec

谢谢

我能够分别控制两个查询。而且,子查询不引用parentQuery的变量的限制也消失了。

1 个答案:

答案 0 :(得分:0)

WITH语句提供多个查询以相互交互。这与FROM子句中的子查询不同,在FROM子句中,每个查询彼此独立。

CTE的另一个功能在这里变得有用,最终查询可以调用WITH子句中的任何子查询。我在WITH子句EMP_REC和DEPT_REC中有两个子查询。我打电话给DEPT_REC,它起作用了。

要了解此查询中的数据,请使用Oracle的SCOTT / TIGER数据库,该数据库具有标准表EMP(14行),DEPT等。

感谢您的支持 bb23850