2016-08-11 2 views
0

Я пытаюсь выполнить этот подзапрос в HIVE, но я получаю ошибку, что подзапрос не поддерживается в моей версии для HIVE, к сожалению, мы используем старую версию HIVE.Rewrite Hive IN clause

select col1,col2 from t1 where col1 in (select x from t2 where y = 0) 

Тогда я переписал подзапрос, используя левую Semi присоединиться, как это,

select a.col1,a.col2 
FROM t1 a LEFT SEMI JOIN t2 b on (a.col1 =b.x) 
WHERE b.y = 0 

Этот запрос работает нормально, если я не дают где состояние, но его не распознает таблицу Б, если Я пытаюсь использовать столбец b.any, где условие или использовать столбец b.any в предложении select. Выброс данной ошибки -

Error while compiling statement: FAILED: SemanticException [Error 10004]: Line 3:6 Invalid table alias or column reference 'b': (possible column names 

Любая помощь очень ценится.

+0

Смотрите это и http://stackoverflow.com/questions/26028767/why-cant-hive-recognize-alias-named-in-select-part –

+0

Почему вы не можете просто написать «t2 «вместо« b ». – Bector

+0

Я пробовал, и он не работает, бросает ту же ошибку. –

ответ

0

Вместо t1 a LEFT SEMI JOIN t2 b вы можете сделать что-то вроде этого: t1 a LEFT SEMI JOIN (select * from t2 where y = 0) b.

select a.col1,a.col2 
FROM t1 a LEFT SEMI JOIN (select * from t2 where y = 0) b on (a.col1 =b.x); 

См. Ниже пример.

Department table: 
+--------------------+----------------------+--+ 
| department.deptid | department.deptname | 
+--------------------+----------------------+--+ 
| D101    | sales    | 
| D102    | finance    | 
| D103    | HR     | 
| D104    | IT     | 
| D105    | staff    | 
+--------------------+----------------------+--+ 

Employee tabe: 
+-----------------+------------------+------------------+--+ 
| employee.empid | employee.salary | employee.deptid | 
+-----------------+------------------+------------------+--+ 
| 1001   | 1000    | D101    | 
| 1002   | 2000    | D101    | 
| 1003   | 3000    | D102    | 
| 1004   | 4000    | D104    | 
| 1005   | 5000    | D104    | 
+-----------------+------------------+------------------+--+ 

hive> SELECT 
dept.deptid, dept.deptname 
FROM 
department dept 
LEFT SEMI JOIN 
(SELECT * FROM employee WHERE salary > 3000) emp 
ON (dept.deptid = emp.deptid); 
+--------------+----------------+--+ 
| dept.deptid | dept.deptname | 
+--------------+----------------+--+ 
| D104   | IT    | 
+--------------+----------------+--+ 
2
select a.col1,a.col2 
FROM t2 b RIGHT OUTER JOIN t1 a on (b.x = a.col1) 
WHERE b.y = 0 

- Когда вы используете LEFT SEMI JOIN, где условие не работает в столбце правой стороны таблицы. Пожалуйста, измените свой сценарий на состояние выше.