开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

flink lookup join

select
table_A.user_id
,max(table_B.end_time) as last_time
from table_A
left join table_B FOR SYSTEM_TIME as of table_A.process_time as table_B
on table_A.user_id=table_B.user_id
and table_B.status='0'
group by table_A.user_id

如果右表的数据被on条件过滤掉,理论上结果应该是有user_id,last_time为null,为什么我执行select结果没数据

展开
收起
1810463662270373 2023-07-20 17:45:57 171 0
13 条回答
写回答
取消 提交回答
  • 根据您提供的 SQL 查询语句,可以看出您正在执行一个 "lookup join" 操作,其中右表 table_B 通过条件进行过滤。根据您的预期,如果某个用户在右表中的记录被过滤掉,那么在结果中应该出现该用户的记录,但 "last_time" 为 null。

    以下是一些可能导致查询结果为空的原因:

    1. 数据匹配问题:确保左表和右表之间的 join 条件能够正确匹配,而且满足该条件的记录存在。检查相关的数据是否在左表和右表中都存在,并且满足 join 条件。

    2. 数据过滤问题:根据您的查询语句,由于在 join 条件中包含了右表的过滤条件(即 table_B.status='0'),可能导致右表中的所有记录都无法与左表进行匹配。请检查右表的数据,确保有满足条件的记录存在。

    3. 数据类型问题:如果在 join 条件中涉及到数据类型的比较,确保数据类型匹配。例如,如果 table_A.user_idtable_B.user_id 的数据类型不一致,可能导致 join 失败。

    若您仍然无法确定查询结果为空的具体原因,建议您检查相关的数据和查询逻辑,确保表中的数据和 join 条件是正确的。同时,可以尝试以更小的数据集或简化的查询逻辑进行测试,以确定问题的根源。

    2023-07-24 21:41:31
    赞同 展开评论 打赏
  • 如果右表的数据被on条件过滤掉,那么在使用FOR SYSTEM_TIME as of子句时,将找不到匹配的数据,导致左表也找不到相应的历史数据。因此,如果执行select语句没有结果,则说明没有匹配的数据可以用于返回结果。

    2023-07-21 20:32:46
    赞同 展开评论 打赏
  • 如果右表的数据被on条件过滤掉,那么在使用left join时,左表中的所有行都会包含在结果中,而右表中的匹配行将会被包含,没有匹配的行将会被填充为NULL。根据你的查询语句,如果右表中的数据被过滤掉,那么结果应该会返回左表中的所有user_id,而last_time将会被填充为NULL。

    2023-07-21 15:18:08
    赞同 展开评论 打赏
  • 问题总能找到解决方案的

    两张表:
    tbuser
    image.png
    tbusertag
    image.png

    第一种sql:

    SELECT t1.user_id,t2.tag_name from tbuser t1 left join tbusertag t2 on t1.user_id = t2.user_id
    where t2.tag_name='a'
    

    image.png

    第二种sql:

    SELECT t1.user_id,t2.tag_name from tbuser t1 
    left join ( SELECT * FROM  tbusertag WHERE tag_name='a' )t2 on t1.user_id = t2.user_id
    

    image.png

    由上面的结果猜测你想要的是第二种结果,在这种情况下,需要先将右表中符合要求的数据筛选出来后再进行 left join,否则在sql实际执行过程中会先将 left join 的结果筛选出来后再对这个结果进行 where 条件筛选,也就是第一种的结果了

    2023-07-21 14:17:16
    赞同 展开评论 打赏
    1. 表 table_A 中没有数据:请确保表 table_A 中存在数据,否则无论如何都不会有结果返回。

    2. 表 table_B 中的数据不符合连接条件:请检查表 table_B 中的数据和连接条件是否匹配。如果没有满足 table_B.status='0' 的行,那么就不会有结果返回。

    3. 数据库中对于时间点的还原不支持:根据您的 SQL 查询语句中的 FOR SYSTEM_TIME as of table_A.process_time,看起来您尝试使用数据库的历史数据功能,以获取指定时间点的数据。请确认您所使用的数据库是否支持这样的操作,并且是否正确配置了相关参数。

    4. 表名、字段名或连接条件错误:请仔细检查表名、字段名和连接条件是否拼写正确,大小写是否一致等。一个小的拼写错误可能会导致结果集为空。

    2023-07-21 14:11:34
    赞同 展开评论 打赏
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。

    如果右表的数据被on条件过滤掉,那么理论上结果应该是有user_id,last_time为null。如果您的查询结果没有数据,那么可能是因为您的查询语句中存在一些错误或者不完整的地方。例如,您可能没有正确地使用LEFT JOIN或者INNER JOIN等操作符,或者没有正确地使用GROUP BY等操作符。此外,您可能还没有正确地使用WHERE等操作符来过滤数据。因此,您需要仔细检查您的查询语句,并确保它是正确的。

    2023-07-21 10:50:31
    赞同 展开评论 打赏
  • 月移花影,暗香浮动

    可能是因为在左连接时,右表中没有符合条件的数据,导致结果集为空。您可以尝试使用LEFT JOIN和WHERE子句来过滤掉右表中不符合条件的数据,例如:

    SELECT
      table_A.user_id,
      MAX(table_B.end_time) AS last_time
    FROM
      table_A
    LEFT JOIN table_B ON table_A.user_id = table_B.user_id AND table_B.status = '0'
    WHERE
      table_B.status = '0'
    GROUP BY
      table_A.user_id;
    

    这样可以确保只返回符合条件的数据,如果右表中没有符合条件的数据,则结果集中的last_time将为NULL。

    2023-07-21 09:17:47
    赞同 展开评论 打赏
  • 热爱开发

    可能是因为您的查询中缺少了必要的条件,导致无法正确地将左表和右表连接起来。在这种情况下,即使右表中的数据被过滤掉,左表和右表仍然无法连接。因此,建议您检查一下查询语句是否正确,并添加必要的条件以确保正确的连接。

    2023-07-21 09:02:52
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,在Flink中,使用FOR SYSTEM_TIME AS OF进行时间旅行查询时,需要注意以下几点:

    1. 只能在维度表(右表)上进行时间旅行查询,不能在事实表(左表)上进行时间旅行查询。因为事实表是实时更新的,历史数据只存在于维度表中。

    2. 时间旅行查询需要基于事件时间或处理时间进行,如果使用了FOR SYSTEM_TIME AS OF,则查询的是处理时间。因此,在查询语句中需要指定processing-time语义,并将左表的时间字段和右表的时间字段统一为处理时间。

    3. 在执行时间旅行查询时,需要保证左表和右表的时间窗口对齐。即,左表和右表的时间窗口需要有交集,否则右表的数据无法参与到左表的聚合计算中。

    根据你提供的查询语句,可以看到使用了FOR SYSTEM_TIME AS OF进行时间旅行查询,并且指定了左表的process_time字段作为时间字段。但是,你没有给出左表和右表的时间窗口定义,也没有给出左表和右表的时间窗口边界对齐的规则。因此,可能存在以下情况:

    1. 如果左表和右表的时间窗口没有交集,那么右表的数据无法参与到左表的聚合计算中,因此查询结果为空。

    2. 如果左表和右表的时间窗口有交集,但是右表的数据被ON条件过滤掉了,那么左表的聚合计算结果中,对应右表的last_time列值为NULL。如果查询结果为空,可能是因为没有符合条件的左表数据,或者左表和右表的时间窗口没有交集。

    因此,建议你检查一下左表和右表的时间窗口定义,以及左表和右表的时间窗口边界对齐的规则,确保查询语句正确执行。同时,可以尝试将查询语句拆分成多个步骤,逐步排查问题所在。

    2023-07-21 08:01:01
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    您好!根据您提供的SQL语句,在Flink SQL中,如果右表的数据被ON条件过滤掉,LEFT JOIN查询结果中对应的列值将会是NULL。因此,您的SQL语句理论上应该能够返回符合条件的结果,其中last_time列的值为NULL。

    如果您执行SELECT语句后没有返回任何结果,可能是由于没有符合条件的数据。您可以检查以下几个方面:

    1. 检查表A和表B中是否存在符合ON条件的数据。如果不存在,LEFT JOIN查询不会返回任何数据。

    2. 检查表B中是否存在满足WHERE条件的数据。如果不存在,LEFT JOIN查询结果中对应的列值将会是NULL。

    3. 检查表A和表B中是否存在符合GROUP BY条件的数据。如果不存在,GROUP BY查询不会返回任何数据。

    2023-07-21 08:00:57
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    根据您提供的 SQL 查询语句,如果右表的数据在 ON 条件过滤掉,按照理论上的预期,查询结果应该包含 user_id 列和 last_time 列,其中 last_time 的值为 NULL。然而,如果执行该查询后没有返回任何数据,可能是由于以下原因之一:

    1. 数据匹配问题:右表中的数据可能与左表中的记录无法匹配。请确保 table_B 中具有与 table_Auser_id 匹配的记录,并且满足 table_B.status='0' 的条件。

    2. 表别名问题:请确保使用正确的表别名来引用每个表,以避免语法错误或混淆。在您的查询中,表别名为 table_Atable_B

    3. 没有匹配的数据:如果没有符合条件的数据行,查询将不会返回任何结果。请检查数据是否满足 ON 条件和其他过滤条件。

    4. 数据库配置问题:某些数据库系统可能需要适当的设置才能支持 FOR SYSTEM_TIME 子句。请确保您正在使用的数据库系统支持此功能,并进行了正确的配置。

    2023-07-20 18:35:55
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    如果右表中的所有记录都被on条件过滤掉,则在左表中仍然存在的user_id会产生一行结果,且last_time列的值为NULL。这是因为在这种情况下,左表的每一行都会与右表中的空行进行连接,而MAX()函数在空行上返回NULL。

    在您提供的查询中,on条件包括table_B.status='0',因此如果右表中的所有记录都具有不同的status值,则结果集可能为空。另外,如果table_A中的所有user_id在右表中都不存在,则结果集也可能为空。

    2023-07-20 18:08:32
    赞同 展开评论 打赏
  • 根据您提供的 SQL 查询语句,当右表数据被 ON 条件过滤掉时,理论上结果应该存在 user_id,并且 last_time 为 null。

    但是,如果执行该查询后没有返回任何数据,可能是由于以下原因之一:

    1. 数据匹配问题:确保 table_A 和 table_B 中的 user_id 存在相应的匹配关系。如果没有匹配的记录,则不会返回结果。

    2. 时间范围问题:使用 AS OF 子句可以在某个时间点查询表 B 的数据,但是要确保该时间点对应的 process_time 值已经存在于 table_A 中。如果 process_time 值不存在或者不正确,可能导致无法获取到正确的数据。

    3. ON 条件问题:确保 ON 条件中的条件逻辑正确,并且能够过滤掉符合条件的记录。检查 table_B.status='0' 是否是正确的过滤条件,以及其他可能影响匹配的条件。

    4. 数据库配置问题:有时数据库可能存在性能或配置问题,导致查询结果不准确或无返回。请检查数据库连接、权限和配置是否正确。

    2023-07-20 17:57:23
    赞同 展开评论 打赏
滑动查看更多

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载