为啥 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),b
与 distinct a,(b)
或 distinct a,b
相同
我会怀疑数据。例如,您确定一个表或另一个表中的值没有右填充空格(例如,因为它们是CHAR
数据类型,而不是VARCHAR2
)?运行 DESCRIBE T1
和 DESCRIBE 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