为啥 Oracle Left Join 在应该有值的地方返回 null

Posted

技术标签:

【中文标题】为啥 Oracle Left Join 在应该有值的地方返回 null【英文标题】:Why Oracle Left Join return null where there should be value为什么 Oracle Left Join 在应该有值的地方返回 null 【发布时间】:2021-02-04 06:38:42 【问题描述】:

我有这个使用左连接 3 个表的查询。但结果为空。

t1

col1 col2
AA 000011
AA 000012
AA 000013
BB 000023

t2

col1 col2
01 AA
01 AA2
01 AA3
02 BB
SELECT PMF.Col1,PMF.Col2 
FROM (SELECT DISTINCT(col1)
             FROM T1) TAS
    LEFT JOIN T2 PMF
        ON (TAS.col1 = PMF.col2)
    LEFT JOIN t3 BU
        ON (PMF.col1= BU.col1)

但是如果我运行查询,结果的数量是正确的,但值都是空的。 结果

col1 col2
null null
null null

预期结果应该是

col1 col2
01 AA
02 BB

行数正确但值为空 ActualResult

【问题讨论】:

与您的问题无关,但是:distinct 不是函数。它始终适用于选择列表中的所有列。用括号括住其中一列不会改变任何东西并且是无用的。 distinct (a),bdistinct a,(b)distinct a,b 相同 我会怀疑数据。例如,您确定一个表或另一个表中的值没有右填充空格(例如,因为它们是CHAR 数据类型,而不是VARCHAR2)?运行 DESCRIBE T1DESCRIBE T2 并与我们分享连接中涉及的列的确切数据类型和长度。 要检查的其他内容:已提交与未提交的事务。两个表是否在同一个模式中,查询是否也从同一个模式运行?如果不是,插入(或任何其他数据操作)是否提交在不是您运行查询的架构中的架构中? @mathguy 两列都是 varchar2,因为它们没有任何填充或空格。是的,两个表都来自同一个模式。如果有帮助,还添加了屏幕截图。 是我遗漏了什么,还是问题中没有显示t3 的数据? 【参考方案1】:

查看预期结果,您似乎需要来自t2 的数据,因此您可以使用以下查询:

SELECT distinct PMF.Col1,PMF.Col2 
FROM T1 TAS
    JOIN T2 PMF
        ON (TAS.col1 = PMF.col2)
    LEFT JOIN t3 BU
        ON (PMF.col1= BU.col1)

【讨论】:

这不能回答 OP 的问题。他没有问如何做某事或其他事情(尽管也许他确实需要那种帮助)。相反,他在问为什么他做过的事情会得到意想不到的结果。乍一看,这个问题是有道理的——结果不是预期的。可能有原因,但与解决他的问题的另一种方法(或者我们可能认为他的问题是什么)无关。【参考方案2】:

你的问题很混乱。代码有三个表,但你在问题中只显示了两个。

您查询中的问题是第二个on 子句:

SELECT PMF.Col1,PMF.Col2 
FROM (SELECT DISTINCT(col1)
      FROM T1
     ) TAS LEFT JOIN
     T2 PMF
     ON TAS.col1 = PMF.col2 LEFT JOIN
     BU
     ON PMF.col1 = BU.col1;
--------^

ON 子句需要与PMF 匹配。你得到NULL 值,因为没有匹配。逻辑也有点复杂,因为PMF.col2 匹配TAS,而不是PMF.col1

在任何情况下,您都应该使用第一个表中的一列,我认为是:

SELECT PMF.Col1,PMF.Col2 
FROM (SELECT DISTINCT col1
      FROM T1
     ) TAS LEFT JOIN
     T2 PMF
     ON TAS.col1 = PMF.col2 LEFT JOIN
     BU
     ON TAS.col1 = BU.col1;

还要注意,在SELECT DISTINCT 中使用括号是愚蠢的。 SELECT DISTINCT 适用于所有选择的列和表达式。括号什么都不做。

【讨论】:

以上是关于为啥 Oracle Left Join 在应该有值的地方返回 null的主要内容,如果未能解决你的问题,请参考以下文章

为啥以及何时在 WHERE 子句中带有条件的 LEFT JOIN 不等于在 ON 中的相同 LEFT JOIN? [复制]

Oracle left join 或right join

[转]Oracle left join right join

深入Oracle的left join中on和where的区别详解

Oracle的left join中on和where的区别

Oracle的left join中on和where的区别