我正在比较SQL引擎之间的行为。 Oracle有一种我期望从SQL引擎获得完全外连接的行为:
CREATE TABLE sql_test_a
(
ID VARCHAR2(4000 BYTE),
FIRST_NAME VARCHAR2(200 BYTE),
LAST_NAME VARCHAR2(200 BYTE)
);
CREATE TABLE sql_test_b
(
NUM VARCHAR2(4000 BYTE),
FIRST_NAME VARCHAR2(200 BYTE),
LAST_NAME VARCHAR2(200 BYTE)
);
INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('1', 'John', 'Snow');
INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('2', 'Mike', 'Tyson');
INSERT INTO sql_test_b (NUM, FIRST_NAME, LAST_NAME) VALUES ('20', 'Mike', 'Tyson');
当我执行以下操作时,它会给我预期的结果。结果表包含两行,其中一行包含NULL
字段的NUM
,因为表sql_test_b
中没有约翰雪。
SELECT A.FIRST_NAME, A.LAST_NAME, A.ID, B.NUM
FROM
SQL_TEST_A A
FULL OUTER JOIN
SQL_TEST_B B
ON
A.FIRST_NAME = B.FIRST_NAME
AND
A.LAST_NAME = B.LAST_NAME;
您可以在此处测试sql脚本:http://sqltest.net/
但是,在HIVE中,如果您尝试相同的操作,则完整的外部联接会生成一个包含两行的表。应该是" John Snow"对于FIRST_NAME,LAST_NAME和NUM字段,行包含NULL
。 1
已填入ID
,但就是Matrix
。
为何在HIVE中出现这种奇怪的行为?这是一个错误吗?或者我错过了什么......因为 Oracle 11g 似乎能够更好地处理这个问题。感谢。
答案 0 :(得分:1)
我无法模拟@ Candic3
报告的结果我使用了以下语句以及#34; select"在问题中查询。
value_counts()
请查看附件。
但是,由于未注意到的小错误,例如DDL与实际数据之间的数据类型不匹配(例如,来自平面文件)或DDL中提到的分隔符与实际数据中的分隔符不匹配,因此select查询将返回NULL 。
答案 1 :(得分:0)
我认为问题是“(”之后的情况与传统的sql略有不同。
SELECT A.FIRST_NAME, A.LAST_NAME, A.ID, B.NUM
FROM
SQL_TEST_A A
FULL OUTER JOIN
SQL_TEST_B B ON
(A.FIRST_NAME = B.FIRST_NAME AND A.LAST_NAME = B.LAST_NAME);