Can*_*ic3 7 null hadoop hive oracle11g full-outer-join
我正在比较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');
Run Code Online (Sandbox Code Playgroud)
当我执行以下操作时,它会给出预期的结果.结果表包含两行,其中一行包含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;
Run Code Online (Sandbox Code Playgroud)
你可以在这里测试sql脚本:http://sqltest.net/
但是,在HIVE中,如果您尝试相同的操作,则完整的外部联接会生成一个包含两行的表.应该是"John Snow"行的行包含NULL
FIRST_NAME,LAST_NAME和NUM字段.该1
填充的ID
,但仅此而已.
为何在HIVE中出现这种奇怪的行为?这是一个错误吗?或者我错过了一些东西......因为Oracle 11g似乎能够更好地处理这个问题.谢谢.
我认为条件后的“(”问题与传统的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);
Run Code Online (Sandbox Code Playgroud)