如果我在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
答案 0 :(得分:0)
查看您的查询并根据查询做出假设您报告的结果将是不可能的,这意味着不可能发生的事情。
为什么呢? r.contractid is null
和r.contractid = t.contractid
和t.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记录 - 您看到的结果是预期的。