嗯,是的。您是否创建了一个简单的测试用例来演示?请始终这样做。
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(+);