2016-12-08 12 views
2

Привет Я пытаюсь запустить этот запрос в улье, но получить ошибки 10249 (неподдерживаемых выражение запроса - только один подзапрос поддерживается ...)Hive - Где и OR ошибка пункт

select count(*) from 
(
    select * from tableA 
    union all 
    select * from tableB 
) a 
where a.field1 in (select fieldA in tableC) 
or a.field2 in (select fieldA in tableC) 
or a.field3 in (select fieldA in tableC); 

ли кто-нибудь знает как я могу написать это, чтобы Hive поддерживал этот запрос (отлично работает на SQL-сервере)

+0

Если поддерживается только один подзапрос, вам нужно будет отделить запросы (здесь 3, разделенных OR) и объединить их результаты. –

ответ

0

Скрывает ваш подпрограмм в CTE, левый член и использование или условие в where where.

IE.

with temp as 
    (
    select * from tableA 
    union all 
    select * from tableB 
    ) 

select COUNT(a.*) 
     from temp a left join tableC a1 on a.field1 =a1.fieldA 
     left join tableC a2 on a.field2 =a2.fieldA 
     left join tableC a3 on a.field3 =a3.fieldA 
    where a1.fieldA is not null 
      or a3.fieldA is not null 
      or a3.fieldA is not null 
0

Поскольку вам не нужны поля от tableC, вы можете использовать left semi join вместо in:

select count(*) from 
(
    select * from tableA 
    union all 
    select * from tableB 
) a 
    left semi join tableC c1 on a.field1=c1.fieldA 
    left semi join tableC c2 on a.field2=c2.fieldA 
    left semi join tableC c3 on a.field3=c3.fieldA 
; 

left semi join наполовину присоединиться, то результирующий набор содержит поля только от одного из соединяемых таблиц, только присоединился строки, похожие на внутреннее соединение, но не будут создавать дубликаты, если правая таблица содержит несколько совпадающих строк. LEFT SEMI JOIN эффективно использует некоррелированную семантику подзапроса IN/EXISTS.