我们可以使用不等运算符执行外连接。 当我尝试时,我得到了右外连接的结果,但它不适用于左外连接。
SELECT EMP.ENAME,EMP.SALARY,SALG.SALARY_GRADE
FROM EMPLOYEE EMP , SALARY_GRADES SALG
WHERE EMP.SAL BETWEEN SALG.FROM_RANGE(+) AND SALG.TO_RANGE
上面的查询生成结果作为内部联接,如下面的查询工作正常。
SELECT EMP.ENAME,EMP.SALARY,SALG.SALARY_GRADE
FROM EMPLOYEE EMP , SALARY_GRADES SALG
WHERE EMP.SAL(+) BETWEEN SALG.FROM_RANGE AND SALG.TO_RANGE
我的意思是说右外连接工作正常,但没有留下外连接。
答案 0 :(得分:2)
LEFT和RIGHT JOIN都可以正常工作。给出以下架构:
create table a (
id number
, val number );
insert all
into a values (1, 1)
into a values (2, 2)
into a values (3, 5)
select * from dual;
create table b (
id number
, min_val number
, max_val number );
insert all
into b values (1, 1, 1)
into b values (2, 1, 6)
into b values (3, 4, 6)
into b values (3, 10, 12)
select * from dual;
这两个查询返回预期的数据。请注意我使用ANSI连接。
select *
from a
left outer join b
on a.val between b.min_val and b.max_val;
select *
from a
right outer join b
on a.val between b.min_val and b.max_val;
如果您对数据库或代码是否存在问题有任何疑问,您应该假设您的代码不正确或数据库中的数据根本不存在。它不太可能成为数据库本身。
测试这个的一个非常好的方法是像我一样做,创建一个非常简单的例子。一个short, self-contained, correct example,用于演示您正在使用的概念。然后,您可以将其应用于您自己的代码,以找出您可能出错的地方。
您评论过:
感谢您的回答,但......当我再插入4条记录时 使用插入值(4,50)作为id和50作为值;然后,如果我 查询使用oracle专有语法,如select * from a,b where b.min_val(+)和b.max_val之间的a.val;我没有插入 在结果中记录......?它正在使用ansi语法,但没有 传统语法.....
因此,这意味着使用Oracle专有语法的查询不正确。我更喜欢ANSI标准,因为如果你做错了什么并且它是可移植的,这是非常明显的。但是,如果您想使用Oracle语法,原因是您已将其转换为INNER JOIN但未声明BETWEEN中的两个项都是OUTER JOIN的一部分:
select *
from a
, b
where a.val between b.min_val(+) and b.max_val(+);