KSQL : Left Join with Not Equal where 条件不满足结果

KSQL : Left Join with Not Equal where condition is not satisfying the result

请找出以下问题并确认。

第 1 步: 根据加入条件,从 table 中获取值并填充。 由于 table B 中没有匹配值,所有列都被填充为 NULL 值。

列:B.OP_TYPE、B.DEMO_ID

ksql> SELECT PLAN_ID,A_OP_TYPE,B.OP_TYPE,A.PRIMARY_DEMO_ID,B.DEMO_ID \
FROM TBL_PLN_PRO_DIV_SDIV A \
LEFT JOIN  TBL_MS_TARGET_GROUP11 B \
ON (A.PRIMARY_DEMO_ID=B.DEMO_ID);
382591 | U | null | 3085 | null

具有 where 条件的相同 select 查询给出与预期相同的结果。

ksql> SELECT PLAN_ID,A_OP_TYPE,B.OP_TYPE,A.PRIMARY_DEMO_ID,B.DEMO_ID \
FROM TBL_PLN_PRO_DIV_SDIV A \
LEFT JOIN  TBL_MS_TARGET_GROUP11 B \
ON (A.PRIMARY_DEMO_ID=B.DEMO_ID) WHERE B.OP_TYPE IS NULL;
382591 | U | null | 3085 | null

但是当我们尝试 select 与 Not Equal where condition 时,相应的查询没有给出正确的结果。 B.OP_TYPE != 'D' - 这是包含 B.OP_TYPE 的条件为 null

ksql> SELECT PLAN_ID,A_OP_TYPE,B.OP_TYPE,A.PRIMARY_DEMO_ID,B.DEMO_ID \
FROM TBL_PLN_PRO_DIV_SDIV A \
LEFT JOIN  TBL_MS_TARGET_GROUP11 B \
ON (A.PRIMARY_DEMO_ID=B.DEMO_ID) WHERE B.OP_TYPE != 'D';

到目前为止您所描述的内容与 SQL 的行为方式并不矛盾。重要的是 NULL 意味着没有价值。所以 FOO != 'B' 匹配 FOONULL 的地方。

您没有提供 TBL_PLN_PRO_DIV_SDIVTBL_MS_TARGET_GROUP11 的示例数据,因此很难在这里提供明确的帮助。

如果您的查询没有 return 行 A_OP_TYPE != 'D' 那么我同意有些地方不对,因为您已经证明有行 A_OP_TYPE='U'(即 != 'D')。但是,如果您没有来自 TBL_MS_TARGET_GROUP11 的匹配记录,其中 OP_TYPE 的值不是 D,您将无法匹配。

员工Table:

select 来自 emp1 的 empno、ename、job、deptno;

7839 国王总统 10 7698 布莱克经理 30 7902 福特分析师 20 7369 史密斯文员 20

select * 来自 dept1;

10 会计纽约 30 销售芝加哥

没有任何 where 条件的左连接:

select empno,ename,job,a.deptno,a.DEPTNO,DNAME from emp1 a left join dept1 b on (a.DEPTNO = b.DEPTNO)

7839    KING    PRESIDENT   10  10  ACCOUNTING
7698    BLAKE   MANAGER     30  30  SALES
7369    SMITH   CLERK       20  20  
7902    FORD    ANALYST     20  20  

where condition with Null value 

select empno,ename,job,a.deptno,a.DEPTNO,DNAME from emp1 a left join dept1 b on (a.DEPTNO = b.DEPTNO) where DNAME is null;

7369    SMITH   CLERK   20  20  
7902    FORD    ANALYST 20  20  

select empno,ename,job,a.deptno,a.DEPTNO,DNAME from emp1 a left join dept1 b on (a.DEPTNO = b.DEPTNO) where DNAME != 'ACCOUNTING';

7698 BLAKE 经理 30 30 销售