我们可以使用外连接执行非连接吗?

时间:2013-06-08 11:42:45

标签: oracle join

我们可以使用不等运算符执行外连接。 当我尝试时,我得到了右外连接的结果,但它不适用于左外连接。

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

我的意思是说右外连接工作正常,但没有留下外连接。

1 个答案:

答案 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;

Here's the proof

如果您对数据库或代码是否存在问题有任何疑问,您应该假设您的代码不正确或数据库中的数据根本不存在。它不太可能成为数据库本身。

测试这个的一个非常好的方法是像我一样做,创建一个非常简单的例子。一个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(+);