0

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

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

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

4

1 回答 1

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;

这是证据

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

一个很好的测试方法是像我一样做,创建一个非常简单的例子。一个简短的、独立的、正确的示例,演示了您正在使用的概念。然后,您可以将其应用于您自己的代码,以找出您可能出错的地方。


你评论过:

感谢您的回答,但是......当我使用 insert into a values(4,50) 插入一个 4 作为 id 和 50 作为值的记录时;然后,如果我使用 oracle 专有语法进行查询,例如 select * from a, b where a.val between b.min_val(+) and b.max_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(+);
于 2013-06-08T12:20:53.253 回答