我正在努力实现以下目标:
我有两个大表,它们之间没有公用密钥。显然,当我想加入它们时,它是笛卡尔积,例如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的变量的限制也消失了。
答案 0 :(得分:0)
WITH语句提供多个查询以相互交互。这与FROM子句中的子查询不同,在FROM子句中,每个查询彼此独立。
CTE的另一个功能在这里变得有用,最终查询可以调用WITH子句中的任何子查询。我在WITH子句EMP_REC和DEPT_REC中有两个子查询。我打电话给DEPT_REC,它起作用了。
要了解此查询中的数据,请使用Oracle的SCOTT / TIGER数据库,该数据库具有标准表EMP(14行),DEPT等。
感谢您的支持 bb23850