【问题标题】:KSQL : Left Join with Not Equal where condition is not satisfying the resultKSQL:不等于条件不满足结果的左连接
【发布时间】:2019-02-26 19:14:35
【问题描述】:

请找到以下问题并确认。

步骤01: 根据加入条件,从表中获取值并进行填充。 由于表 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 条件相同的选择查询给出与预期相同的结果。

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

但是当我们尝试使用 Not Equal where 条件进行选择时,相应的查询没有给出正确的结果。 B.OP_TYPE != 'D' - 这是包含 B.OP_TYPE 的条件为空的地方

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';

【问题讨论】:

  • 嗨。了解 LEFT JOIN 返回的内容:INNER JOIN 行加上由 NULL 扩展的不匹配的左表行。作为 LEFT JOIN 的一部分,始终知道您想要什么 INNER JOIN。在 LEFT JOIN ON 删除任何由 NULL 扩展的行之后,需要右表列不为 NULL 的 WHERE 或 ON,即只留下 INNER JOIN 行,即“将 LEFT JOIN 转换为 INNER JOIN”。你有那个。
  • 这是一个常见问题解答。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用一个变体搜索您的标题和关键字作为您的标签。请参阅向下投票箭头鼠标悬停文本。如果您确实有要发布的非重复代码问题,请阅读并通过minimal reproducible example 采取行动。
  • 您的问题到底是什么?此外,您不只是使用 != 而不是 =,而是将 ON 更改为 WHERE。 PS请阅读有关代码块格式的编辑帮助并以可读的方式格式化您的代码。

标签: apache-kafka confluent-platform ksqldb


【解决方案1】:

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

您尚未提供 TBL_PLN_PRO_DIV_SDIVTBL_MS_TARGET_GROUP11 的示例数据,因此很难在此处提供明确的帮助。

如果您的查询没有返回 A_OP_TYPE != 'D' 所在的行,那么我同意有些地方是不正确的,因为您已经表明存在 A_OP_TYPE='U' 的行(即!= 'D')。但是,如果您没有来自TBL_MS_TARGET_GROUP11 的匹配记录,其中OP_TYPE 的值不是D,您将不会得到匹配项。

【讨论】:

  • 谢谢罗宾。你说的对 。我检查了 RDBMS 并看到了相同的行为。
  • 太棒了——将我的答案标记为正确(如果正确)或至少投赞成票是很有礼貌的。
【解决方案2】:

员工表:

从emp1中选择empno,ename,job,deptno;

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

从部门 1 中选择 *;

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 MANAGER 30 30 销售

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2021-05-30
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多