左连接表达式和Oracle返回的行数

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的任何限制.到目前为止,我们认为这是一个错误.

使用的数据:

  • 答:Id = 1,描述=项目A1;
  • B:Id = 1,描述=项目B1;
  • C:Id = 1,Id_B = 2,Flag = S.

Gor*_*off 1

你的假设t2.id = t2.id总是正确的,但这是错误的。如果该值是,NULL则将被视为 false。我不认为这与这个特定的例子相关,只是为了澄清。

问题是如何left join处理。这个想法很简单。该on条款已处理。如果没有匹配项,则保留第一个表中的行。这与条款中的内容无关on。(这是一个功能描述;有许多可能的实现。)

根据您的示例数据,Oracle 是不正确的。应返回一行。SQL Server 示例还应返回一行。我怀疑数据可能略有不同;我个人在 SQL Server(或 Oracle)中从未遇到过left joins 问题。