2016-01-05 15 views
0

У меня есть две таблицы:Альтернативная логика подзапроса как часть условия

 T1 

key code1 code2 code3 
    1  A  A  A 
    2  B  B  G 
    3  A  B  C 
    4  C  C  C 
    5  D  E  F 
    6  E  E  E 
    7  A  D  G 
    8  G  G  G 


     T2 

code class1 class2 class3 
    A  1  0  0  
    B  0  1  0  
    C  0  1  0  
    D  1  1  0  
    E  0  0  1  
    F  0  1  0  
    G  1  0  0  

Я хочу написать запрос как ...

create table T3 as 
select key, case 
      when code1 in (select code from T2 where class1 = 1) or 
       code2 in (select code from T2 where class1 = 1) or 
       code3 in (select code from T2 where class1 = 1) 
       then 1 else 0 
      end as class1, 
      case 
      when code1 in (select code from T2 where class2 = 1) or 
       code2 in (select code from T2 where class2 = 1) or 
       code3 in (select code from T2 where class2 = 1) 
       then 1 else 0 
      end as class2, 
      case 
      when code1 in (select code from T2 where class3 = 1) or 
       code2 in (select code from T2 where class3 = 1) or 
       code3 in (select code from T2 where class3 = 1) 
       then 1 else 0 
      end as class3 
from T1 

Это в основном говорят, для каждого ключа в T1, посмотрите, соответствует ли соответствующий код в T2 1 для каждого класса. Если это так, то новый столбец равен 1.

Проблема в том, что я использую версию HiveQL, которая не поддерживает подзапросы в условных операторах вроде этого. Существует ли альтернативный метод для достижения одного и того же набора результатов? Я думал о чем-то вроде присоединения, но я не уверен в лучшем способе сделать это в этом случае из-за того, что T2 не имеет соответствующего ключа.

Для справки, результирующий набор будет

 T3 

key class1 class2 class3 
    1  1  0  0 
    2  1  1  0 
    3  1  1  0 
    4  0  1  0 
    5  1  1  1 
    6  0  0  1 
    7  1  1  0 
    8  1  0  0 

ответ

1
SELECT `key`, 
MAX(CASE WHEN class1 = 1 THEN 1 ELSE 0 END) as class1, 
MAX(CASE WHEN class2 = 1 THEN 1 ELSE 0 END) as class2, 
MAX(CASE WHEN class3 = 1 THEN 1 ELSE 0 END) as class3 
FROM t1 JOIN t2 ON t1.code1=t2.code 
OR t1.code2=t2.code 
OR t1.code3=t2.code 
GROUP BY `key` 

Предполагая, что MySQL, ключ является зарезервированным словом, вам нужна кавычка

+0

Я не верю, что это сработает, так как вы получите более одного результата для каждого ID. –

+0

Возможно, отдельный или макс для каждого случая решает проблему. –

+0

Distinct не сработает. Max должен хотя бы – JamieD77

1

Это соответствует вашим ожидаемым результатам:

SELECT 
    [key], 
    MAX(T2.class1) AS class1, 
    MAX(T2.class2) AS class2, 
    MAX(T2.class3) AS class3 
FROM 
    dbo.T1 
LEFT OUTER JOIN dbo.T2 ON T2.code IN (T1.code1, T1.code2, T1.code3) 
GROUP BY 
    [key] 
+0

К сожалению, HIVE 0.12 не поддерживает условия соединения, которые не являются условиями равенства, то есть это не сработает. Другой ответ не будет работать, поскольку он не поддерживает OR. Должен ли я создать 3 разных таблицы, а затем объединить их? @TomH – Danzo

+0

Yuck. Какой ограничительный язык. Это похоже на то, что несколько объединений - единственная возможность. –