left outer join在select语句中抛出空值

ws51t4hk  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(534)

如果我在提到 t.contractid=111111select 声明。请告诉我如何解决这个问题。

select t.contractid,r.contractid,t.batchno
from tableA t 
left join tableB r 
on t.contractid=r.contractid and t.PayGrp=r.PayGrp and t.PriNo=r.PriNo 
where t.contractid=111111 and t.PayGrp=0 and t.batchno=201701 and t.prino=3
and r.contractid is null

样本输出:

null    null    201701
null    null    201701
null    null    201701
null    null    201701
null    null    201701
zvms9eto

zvms9eto1#

查看您的查询并根据查询做出假设您正在报告的结果将是不可能的,这意味着发生了一些不可能的事情。
为什么?这是不可能的 r.contractid is null 以及 r.contractid = t.contractid 以及 t.contractid=111111 对所有人的评价都是正确的。然而,您的查询正在询问数据库这个问题,它正在返回结果。
解释结果的唯一方法是tablea.contracd和tableb.contracd有一个自定义数据类型,其中比较这些数据类型会得到等于111111的空值。类似地,paygrpt.paygrp将需要一个数据类型,将null与0进行比较将计算为true。当然,只有查看表的数据定义才能告诉我们这一点。
也就是说,我在join语句中遇到了列匹配的奇怪结果,其中一方或另一方为null。因此,在考虑其他可能性之前,请尝试在isnull()中 Package join和where条件:

select t.contractid, r.contractid, t.batchno
from tableA t left join
     tableB r 
     on IsNull(t.contractid,0) = IsNull(r.contractid,0) and
         IsNull(t.PayGrp,0) = IsNull(r.PayGrp,0) and
         IsNull(t.PriNo,0) = IsNull(r.PriNo, 0)
where IsNull(t.contractid,0) = 111111 and IsNull(t.PayGrp,0) = 0 and
      IsNull(t.batchno,0) = 201701 and IsNull(t.prino,0) = 3 and
      r.contractid is null;

如果上面的查询仍然产生相同的结果,那么您将处理某种系统错误,例如损坏的数据库(或该数据库的内存缓存)或者更不可能的硬件错误。首先尝试重新启动数据库服务器和执行查询的客户机(如果它们不相同),如果重新启动后错误仍然存在,请尝试将数据移动到其他数据库/db服务器并执行相同的查询。此时,您将知道您的数据库是否已损坏,或者在数据库服务器上遇到系统错误。

gojuced7

gojuced72#

您正在限制您的查询
r、 contracid为空
因此,它只返回空记录-您看到的结果是预期的。

nbnkbykc

nbnkbykc3#

这是您的问题:

select t.contractid, r.contractid, t.batchno
from tableA t left join
     tableB r 
     on t.contractid = r.contractid and
        t.PayGrp = r.PayGrp and
        t.PriNo = r.PriNo 
where t.contractid = 111111 and t.PayGrp = 0 and
      t.batchno = 201701 and t.prino = 3 and
      r.contractid is null;

结果集总是以 111111, NULL ,基于 WHERE 条款。 t.contractid 必须有价值。确定表别名正确吗?那就是 where 子句是否正确?

相关问题