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'
不 匹配 FOO
是 NULL
的地方。
您没有提供 TBL_PLN_PRO_DIV_SDIV
和 TBL_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 销售
请找出以下问题并确认。
第 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'
不 匹配 FOO
是 NULL
的地方。
您没有提供 TBL_PLN_PRO_DIV_SDIV
和 TBL_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 销售