2016-06-14 6 views
6

Я сравниваю поведение между SQL-машинами. Oracle имеет поведение я бы ожидать от SQL двигателя для полного внешнего соединения:Почему полное внешнее соединение в HIVE дает странный результат, когда отсутствует одно из полей объединения?

Oracle

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 отсутствует снег john.

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

В энцефалопатии, однако, если вы должны были попробовать то же самое, полное внешнее объединение результатов в таблице с двумя рядами , Строка, которая должна быть строкой «Джон Снег», содержит NULL для полей FIRST_NAME, LAST_NAME и NUM. 1 заполняется для ID, но все.

Почему такое странное поведение в отношении ВИЧ? Это ошибка? Или я что-то пропустил ... потому что Oracle 11g, похоже, справляется с этим намного лучше. Благодарю.

+1

mysql не поддерживает полное внешнее соединение, то как вы получаете правильный результат? – Farooque

+0

Я полагаю, что это Oracle, а не MySQL. Спасибо @Farooque !! – Candic3

+0

Является ли это поведение в ВИЧ-инфекции нормальным? – Candic3

ответ

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); 
1

я не мог имитировать результат сообщенный @ Candic3

Я использовал следующие заявления вместе с то же самое «выбрать» запрос как в вопросе.

CREATE TABLE IF NOT EXISTS sql_test_a (ID String, FIRST_NAME String, LAST_NAME String) COMMENT 'sql_test_a' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE; 


CREATE TABLE IF NOT EXISTS sql_test_b (NUM String, FIRST_NAME String, LAST_NAME String) COMMENT 'sql_test_b' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE; 


INSERT INTO sql_test_a VALUES ('1', 'John', 'Snow'); 
INSERT INTO sql_test_a VALUES ('2', 'Mike', 'Tyson'); 
INSERT INTO sql_test_b VALUES ('20', 'Mike', 'Tyson'); 

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; 

Вы можете найти результат прилагается.

Однако, запрос будет возвращать NULL из-за незаметных незначительных ошибок, таких как несоответствие типа данных между DDL и фактическими данными (скажем, из плоских файлов) или несоответствие между разделителем, указанным в DDL, и данными, содержащимися в фактических данных. Query_result

+0

Что такое 'DDL'? – Candic3

+0

Пожалуйста, прочтите следующее: http://stackoverflow.com/questions/2578194/what-is-ddl-and-dml – Marco99