配置单元查询左连接获取错误结果

iqxoj9l9  于 2021-06-28  发布在  Hive
关注(0)|答案(3)|浏览(338)

首先,创建两个表。

CREATE DATABASE IF NOT EXISTS test;
USE test;
DROP TABLE IF EXISTS student_info;
CREATE TABLE IF NOT EXISTS student_info(
id string COMMENT 'student id',
name string COMMENT 'student name'
)
PARTITIONED BY (l_date string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
ALTER TABLE test.student_info SET SERDEPROPERTIES('serialization.null.format' = '');

DROP TABLE IF EXISTS student_score;
CREATE TABLE IF NOT EXISTS student_score(
id string COMMENT 'student id',
class string COMMENT 'class',
score int COMMENT 'class score'
)
PARTITIONED BY (l_date string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
ALTER TABLE test.student_score SET SERDEPROPERTIES('serialization.null.format' = '');

学生信息表中有4条记录,

1   jobs
2   cook
3   gates
4   musk

学生成绩表中有3项记录,

1   math    98
2   math    96
3   math    94

我要找一个没有分数,id是4的学生。

select * from test.student_info a
left join test.student_score b
on a.id=b.id
where (b.id='' or b.id is null)
and a.id='4';

我什么都没有。但是,我添加了“trim()”。

select * from test.student_info a
left join test.student_score b
on a.id=b.id
where (b.id='' or b.id is null)
and trim(a.id)='4';

我能得到我想要的。

a.id    a.name  b.id    b.class b.score
4   musk    NULL    NULL    NULL

所以,我认为有一个错误。

kcwpcxri

kcwpcxri1#

最好的解决方案是将id的数据类型改为int,我不明白为什么我只看到id的
通过这种方式,您可以确保在不修剪它们的情况下对它们进行比较

eblbsuwk

eblbsuwk2#

就像亚历克斯说的,你一定有空位。我尝试了你发布的关于类似rest数据的查询,得到了想要的结果。
或者,您也可以使用以下查询:

select a.id,a.name,a.l_date,b.class,b.score
FROM student_info a left join student_score b
ON a.id=b.id 
where b.score IS NULL;
f0brbegy

f0brbegy3#

看来你的数据 test.student_info 表在ID之前或之后有空格。这就解释了为什么 a.id='4' 是假的,而 trim(a.id)='4' 这是真的。
如果从文件加载表,请检查是否没有多余的空间。

相关问题