Left Outer Join在select语句中抛出NULL值

时间:2017-06-28 02:58:37

标签: sql sql-server sql-server-2008 hive hiveql

如果我在select语句中提及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

示例输出:

DIR_A

3 个答案:

答案 0 :(得分:0)

查看您的查询并根据查询做出假设您报告的结果将是不可能的,这意味着不可能发生的事情。

为什么呢? r.contractid is nullr.contractid = t.contractidt.contractid=111111所有人都无法评估为真。然而,您的查询是询问数据库该问题并且它正在返回结果。

解释结果的唯一方法是tableA.contractid和tableB.contractid有一个自定义数据类型,其中比较数据类型导致null值等于111111.类似地,PayGrpt.PayGrp需要一个数据类型将null与0进行比较将评估为true。当然,只查看表格的数据定义可以告诉我们。

据说我在连接语句中匹配列时遇到了奇怪的结果,其中一侧或另一侧为空。因此,在考虑其他可能性之前,尝试将您的连接包装在IsNull()中的条件中:

    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;

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

答案 1 :(得分:-1)

这是您的查询:

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子句是否正确?

答案 2 :(得分:-1)

您正在通过

限制查询
  

r.contractid为空

因此它只返回NULL记录 - 您看到的结果是预期的。