and*_*ucz 5 sql oracle join left-join relational-database
使用左连接的查询不返回记录,尽管左表中的where子句应该找到单个记录.在这种情况下,它应该返回一个记录,其中左表中的字段包含值,右表中的字段为null,因为它们之间没有匹配.
显然,使用引用连接表达式上的右表的大小写存在问题.
在SQL Server中,相同的查询按预期工作.
select
t1.Description, t2.Description
from
A t1
left join
B t2
on
t1.Id = t2.Id and
1 = case when (
t2.Id = t2.Id and
(select t3.Flag from C t3 where t3.ID_B = t2.Id) = 'S'
) then 1 else 0
end
where t1.Id = 1
Run Code Online (Sandbox Code Playgroud)
结果:未返回任何行.
然后我移动了表达式t2.Id = t2.Id(这里只是为了演示问题,并且应该总是返回true,显然)在case表达式之外.
select
t1.Description, t2.Description
from
A t1
left join
B t2
on
t1.Id = t2.Id and
t2.Id = t2.Id and
1 = case when (
(select t3.Flag from C t3 where t3.ID_B = t2.Id) = 'S') then 1 else 0
end
where t1.Id = 1
Run Code Online (Sandbox Code Playgroud)
结果:返回一行.
上面的查询仅用于演示问题,在实际情况下无用且未优化.
我想知道是否有人知道与此案相关的Oracle的任何限制.到目前为止,我们认为这是一个错误.
使用的数据:
你的假设t2.id = t2.id总是正确的,但这是错误的。如果该值是,NULL则将被视为 false。我不认为这与这个特定的例子相关,只是为了澄清。
问题是如何left join处理。这个想法很简单。该on条款已处理。如果没有匹配项,则保留第一个表中的行。这与条款中的内容无关on。(这是一个功能描述;有许多可能的实现。)
根据您的示例数据,Oracle 是不正确的。应返回一行。SQL Server 示例还应返回一行。我怀疑数据可能略有不同;我个人在 SQL Server(或 Oracle)中从未遇到过left joins 问题。