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
4

2 回答 2

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]
于 2016-01-05T16:11:42.147 回答
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,key是保留字,需要反引号

于 2016-01-05T15:50:24.537 回答